Прежде чем вы решите использовать MyISAM или InnoDB, вам нужно просмотреть оба механизма хранения с точки зрения того, что каждый из них кэширует.
MyISAM
При чтении индексы таблицы MyISAM могут быть прочитаны один раз из файла .MYI и загружены в кэш ключей MyISAM (по размеру key_buffer_size ). Как вы можете сделать .MYD таблицы MyISAM быстрее для чтения? С этим:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Я писал об этом в моих прошлых постах
InnoDB
ОК, а как насчет InnoDB? InnoDB выполняет дисковый ввод-вывод для запросов? Удивительно, но да! Вы, наверное, думаете, что я схожу с ума от таких слов, но это абсолютно верно, даже для запросов SELECT . В этот момент вы, вероятно, задаетесь вопросом "Как в мире InnoDB выполняет дисковый ввод-вывод для запросов?"
Все это восходит к InnoDB, являющемуся ACID- жалобой Transactional Storage Engine. Для того чтобы InnoDB был транзакционным, он должен поддерживать I
in ACID
, то есть Isolation. Техника для поддержания изоляции для транзакций осуществляется через MVCC, Multiversion Concurrency Control . Проще говоря, InnoDB записывает, как выглядят данные до того, как транзакции пытаются их изменить. Где это записывается? В системном файле табличного пространства, более известном как ibdata1. Это требует дискового ввода-вывода .
СРАВНЕНИЕ
Поскольку и InnoDB, и MyISAM выполняют дисковый ввод-вывод, какие случайные факторы определяют, кто быстрее?
- Размер столбцов
- Формат столбца
- Наборы символов
- Диапазон числовых значений (требующих достаточно больших INT)
- Ряды разбиваются по блокам (цепочка строк)
- Фрагментация данных, вызванная
DELETEs
иUPDATEs
- Размер первичного ключа (InnoDB имеет кластерный индекс, требующий двух ключевых запросов)
- Размер записей индекса
- список можно продолжить ...
Эпилог
Таким образом, в среде с интенсивным чтением таблица MyISAM с фиксированным форматом строки может превзойти чтения InnoDB из пула буферов InnoDB, если в журналы отмены, содержащиеся в ibdata1, записано достаточно данных для поддержки поведения транзакций. накладывается на данные InnoDB. Тщательно планируйте типы данных, запросы и механизм хранения. Как только данные растут, их перемещение может стать очень трудным.
Кстати, я написал что-то вроде этого 5 дней назад: как назначить лимит памяти для mySQL?