MyISAM для зчитування даних


10

У мене є таблиця з приблизно 1 млрд. Рядків, і її 98% інтенсивно читають.

Я спробував налаштувати базу даних, використовуючи різні механізми зберігання даних (MyISAM та InnoDB)

Потім провели кілька тестів, щоб переглянути виставу

У пункті де я мав ідентифікатор первинного ключа, і, здається, оскільки MySAM Key Cache зберігає весь індекс у своєму буфері, використання MyISAM здавалося досить швидким, приблизно в 2 рази швидше, ніж InnoDB

Але для InnoDB це здається повільніше !! Хіба що InnoDB не використовує жодного буфера для попереднього завантаження індексів?


можливо, хтось із тих, хто запускає щасливі модератори, які голосують, щоб закрити питання, може пояснити їх мотивацію?
pQd

Чи можете ви дати нам деяке уявлення про розмір відповідної бази даних та таблиці? Загальний розмір на диску буде корисним. Крім того, яка специфікація - машина, на якій ви працюєте?
Дейв Рікс

Відповіді:


6

Перш ніж приймати рішення про MyISAM або InnoDB, вам доведеться переглянути обидва механізми зберігання з точки зору того, як кешується кожен

MyISAM

Під час читання індекси таблиці MyISAM можна прочитати один раз з файлу .MYI і завантажити в кеш-пам'ять MyISAM (розмір за розміром key_buffer_size ). Як можна швидше зробити .MYD таблиці MyISAM швидше для читання? З цим:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Про це я писав у своїх минулих дописах

InnoDB

Добре, а як щодо InnoDB? Чи InnoDB робить якісь дискові введення / виведення для запитів? Дивно, але так! Ви, напевно, думаєте, що я божевільний, що це сказав, але це абсолютно вірно, навіть для SELECT запитів . На даний момент ви, мабуть, задаєтесь питанням: "Як у світі InnoDB робить дискові введення / виведення для запитів?"

Все повертається до InnoDB, будучи двигуном транзакційного зберігання ACID- скаргами. Для того , щоб InnoDB бути транзакційних, він повинен підтримувати Iв системі ACID, яка є ізоляцією. Техніка підтримки ізоляції для транзакцій здійснюється за допомогою MVCC, Multiversion Concurrency Control . Простіше кажучи, InnoDB записує, як виглядають дані, перш ніж транзакції намагаються їх змінити. Де це записується? У файлі системного простору таблиць, більш відомий як ibdata1. Для цього потрібен диск вводу / виводу .

ПОРІВНЯЙТЕ

Оскільки і InnoDB, і MyISAM роблять диск вводу / виводу, які випадкові фактори диктують, хто швидший?

  • Розмір стовпців
  • Формат стовпця
  • Набори символів
  • Діапазон числових значень (вимагає достатньо великих INT)
  • Ряди розділяються по блоках (рядкові ланцюги)
  • Фрагментація даних, викликана DELETEsтаUPDATEs
  • Розмір первинного ключа (InnoDB має кластерний індекс, що вимагає двох ключових пошукових запитів)
  • Розмір індексних записів
  • список продовжується ...

ЕПІЛОГ

Таким чином, у важкому для читання середовищі можна, щоб таблиця MyISAM з фіксованим форматом рядків перевершила InnoDB зчитування з пулу InnoDB Buffer, якщо в журнали відміни, що містяться в ibdata1, є достатньо даних для підтримки поведінки транзакцій накладені на дані InnoDB. Ретельно сплануйте типи даних, запити та механізм зберігання даних. Як тільки дані зростають, переміщення даних може стати дуже важким.

До речі, я написав щось подібне 5 днів тому: Як призначити ліміт пам’яті для mySQL?


чи справді innodbe генерує будь-які зчитування диска, коли всі дані вже знаходяться в буферному пулі і немає одночасних запитів на зміну даних, просто читає?
pQd

Я гадаю, що оскільки у запитувача 1 мільярда рядків у своєму db, то навряд чи він буде кешований в оперативній пам’яті в буферному пулі - значить, будуть потрібні зчитування, щоб потрапити до даних за межами буферного пулу та на диску?
Дейв Рікс

3

MyISAM завжди працюватиме набагато швидше, ніж innodb, коли немає суперечок для даних. Почніть додавати кілька сеансів, намагаючись оновити один і той же tablse, і innodb дуже швидко отримує перевагу в продуктивності.

Налаштування системи для двох двигунів дуже відрізняється.

Причина існування різних двигунів полягає в тому, що існують різні схеми навантаження / доступу.


2

вам доведеться «розігріти» innodb. наприклад, повторним відтворенням журналів доступу або виконанням розумних запитів, які торкаються кожного значення з індексу.

погляньте сюди чи сюди .

Я сподіваюся, що ви не використовуєте налаштування mysql за замовчуванням для innodb - вони підходили для апаратних засобів від ~ 2000 року.


Я вносив зміни в конфігурацію за замовчуванням, також виконував запит кілька разів, приблизно в 30 разів, але давав майже однакові результати. Це було швидше після декількох спроб, але залишалося повільніше, ніж MYISAM, також використовувався MariaDB (остання версія)
Акаш

1

Перевірте цей сайт, він містить дуже корисну інформацію:

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

Ви також можете налаштувати вашу файлову систему. У мене хороші результати роботи на XFS з оптимальними значеннями sunit та swidth (звичайно, якщо ви використовуєте RAID)


0

Після подальшої настройки InnoDB на MariaDB, я збільшив innodb_buffer_pool_sizeрозмір бази даних InnoDB, оскільки, зробивши це, InnoDB почав швидше отримувати рядки

Я думаю, налаштування InnoDB є досить важливою відповідно до потреб вашої бази даних

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.