Перш ніж приймати рішення про 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?