Как MyISAM может быть «быстрее», чем InnoDB, если
- MyISAM должен выполнять чтение с диска для данных?
- InnoDB использует пул буферов для индексов и данных, а MyISAM только для индекса?
mysql
innodb
myisam
storage-engine
jcho360
источник
источник
Ответы:
Единственный способ MyISAM может быть быстрее, чем InnoDB в этом уникальном случае
MyISAM
При чтении индексы таблицы MyISAM могут считываться один раз из файла .MYI и загружаться в кэш ключей MyISAM (по размеру key_buffer_size ). Как вы можете сделать .MYD таблицы MyISAM быстрее для чтения? С этим:
Я писал об этом в моих прошлых постах
InnoDB
Хорошо, а как насчет InnoDB? InnoDB выполняет дисковый ввод-вывод для запросов? Удивительно, но да! Вы, наверное, думаете, что я схожу с ума от таких слов, но это абсолютно верно, даже для запросов SELECT . В этот момент вы, вероятно, задаетесь вопросом "Как в мире InnoDB выполняет дисковый ввод-вывод для запросов?"
Все это восходит к InnoDB, являющемуся ACID- жалобой Transactional Storage Engine. Чтобы InnoDB был транзакционным, он должен поддерживать
I
inACID
, то есть Isolation. Техника для поддержания изоляции для транзакций осуществляется через MVCC, Multiversion Concurrency Control . Проще говоря, InnoDB записывает, как выглядят данные до того, как транзакции пытаются их изменить. Где это записывается? В системном файле табличного пространства, более известном как ibdata1. Это требует дискового ввода-вывода .СРАВНЕНИЕ
Поскольку и InnoDB, и MyISAM выполняют дисковый ввод-вывод, какие случайные факторы определяют, кто быстрее?
DELETEs
иUPDATEs
Таким образом, в среде с интенсивным чтением таблица MyISAM с фиксированным форматом строки может превзойти операции чтения InnoDB из пула буферов InnoDB, если в журналы отмены, содержащиеся в ibdata1, записано достаточно данных для поддержки поведения транзакций. накладывается на данные InnoDB.
ЗАКЛЮЧЕНИЕ
Тщательно планируйте свои типы данных, запросы и механизм хранения. Как только данные растут, их перемещение может стать очень трудным. Просто спросите Facebook ...
источник
В простом мире MyISAM быстрее для чтения, InnoDB быстрее для записи.
Как только вы начнете вводить смешанные операции чтения / записи, InnoDB также будет быстрее для чтения благодаря своему механизму блокировки строк.
Несколько лет назад я написал сравнение механизмов хранения MySQL , которое сохранилось до наших дней, обрисовав в общих чертах уникальные различия между MyISAM и InnoDB.
По моему опыту, вы должны использовать InnoDB для всего, кроме кэш-таблиц с интенсивным чтением, где потеря данных из-за повреждения не так критична.
источник
Чтобы добавить здесь ответы, касающиеся механических различий между двумя двигателями, я приведу эмпирическое исследование сравнения скорости.
С точки зрения чистой скорости, MyISAM не всегда работает быстрее, чем InnoDB, но, по моему опыту, в рабочих средах PURE READ он работает быстрее примерно в 2,0-2,5 раза. Очевидно, что это не подходит для всех сред - как написали другие, в MyISAM отсутствуют такие вещи, как транзакции и внешние ключи.
Ниже я провел несколько сравнительных тестов - я использовал python для циклов и библиотеку timeit для сравнений по времени. Для интереса я также включил механизм памяти, это дает лучшую производительность по всем направлениям, хотя он подходит только для небольших таблиц (вы постоянно сталкиваетесь,
The table 'tbl' is full
когда превышаете лимит памяти MySQL). Я смотрю на четыре типа выбора:Во-первых, я создал три таблицы, используя следующий SQL
с 'MyISAM', замененным 'InnoDB' и 'memory' во второй и третьей таблицах.
1) Ваниль выбирает
Запрос:
SELECT * FROM tbl WHERE index_col = xx
Результат: ничья
Скорость их в целом одинакова и, как и ожидалось, является линейной по количеству столбцов, которые будут выбраны. InnoDB кажется немного быстрее, чем MyISAM, но это действительно незначительно.
Код:
2) рассчитывает
Запрос:
SELECT count(*) FROM tbl
Результат: MyISAM выигрывает
Этот демонстрирует большую разницу между MyISAM и InnoDB - MyISAM (и память) отслеживает количество записей в таблице, поэтому эта транзакция быстрая и O (1). Количество времени, необходимое для подсчета InnoDB, увеличивается сверхлинейно с размером таблицы в диапазоне, который я исследовал. Я подозреваю, что многие из ускорений от запросов MyISAM, которые наблюдаются на практике, связаны с подобными эффектами.
Код:
3) Условный выбор
Запрос:
SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5
Результат: MyISAM выигрывает
В данном случае MyISAM и память работают примерно одинаково, а InnoDB побеждает примерно на 50% для больших таблиц. Это тот тип запроса, для которого преимущества MyISAM кажутся максимальными.
Код:
4) Подвыбирает
Результат: InnoDB выигрывает
Для этого запроса я создал дополнительный набор таблиц для дополнительного выбора. Каждый из них представляет собой просто два столбца BIGINT, один с индексом первичного ключа, а другой без индекса. Из-за большого размера таблицы я не тестировал движок памяти. Команда создания таблицы SQL была
где снова «MyISAM» заменяется на «InnoDB» во второй таблице.
В этом запросе я оставляю размер таблицы выбора на 1000000 и вместо этого изменяю размер выбранных столбцов.
Здесь InnoDB выигрывает легко. После того, как мы доберемся до таблицы разумных размеров, оба двигателя масштабируются линейно с размером суб-выбора. Индекс ускоряет команду MyISAM, но, что интересно, мало влияет на скорость InnoDB. subSelect.png
Код:
Я думаю, что основной смысл всего этого заключается в том, что если вы действительно беспокоитесь о скорости, вам нужно сравнивать запросы, которые вы делаете, а не делать какие-либо предположения о том, какой механизм будет более подходящим.
источник
SELECT * FROM tbl WHERE index_col = xx
- Вот два фактора, которые могут привести к большей вариации на графике: первичный ключ против вторичного ключа; Индекс кэшируется против нет.SELECT COUNT(*)
Явный победитель MyISAM, пока вы не добавитеWHERE
предложение.Что быстрее? Либо может быть быстрее. YMMV.
Что вы должны использовать? InnoDB - защита от сбоев и т. Д. И т. Д.
источник