MyISAM -vs- InnoDB. Fight!
Как вы возможно знаете, в интернете много споров, о том какой же из хранилищ: MyISAM или InnoDB лучше, но конструктивного ответа нет, по крайней мере на русском языке. И как вы могли понять из названия статьи, в ней мы опишем, все за и против использования каждого из них.
FIGHT!
MyISAM
Одна из основных (наряду с InnoDB) систем хранения данных в СУБД MySQL. Она основывается на коде ISAM и обладает в сравнении с ним рядом полезных дополнений. Таблицы MyISAM прекрасно подходят для использования в WWW и других средах, где преобладают запросы на чтение.
Кратко о плюсах
Итак, MyISAM не поддерживает транзакции и с этим связаны его основные недостатки и преимущества:
1. В большинстве случаев он быстрее, чем InnoDB, так как нет расходов на транзакции
2. Занимает меньше дискового пространства
3. Меньше расход памяти на обновления
4. Полнотекстовый индекс
5. Быстрый INSERT, SELECT
MyISAM отлично подходит для приложений с большой нагрузкой по чтению (OLAP), но он не очень хорошо масштабируется при наличии большого количества записей. Даже если вы обновляете одно поле в одной строке, вся таблица будет заблокирована и ни один процесс не сможет ничего прочитать пока запрос не завершится. MyISAM быстро выполняет вычисления для запросов типа SELECT COUNT(*).
Для таблиц этого типа создан ряд специализированных утилит!, позволяющих манипулировать табличными файлами. Так же, таблицы MyISAM являются платформенно-независимыми. Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. Для этого MySQL хранит все числа с плавающей запятой в формате IEEE, а все целые числа — в формате с прямым порядком следования байтов.
Индексные файлы имеют расширение .MYI (MYIndex). Файлы с расширением .MYD (MYData) содержат данные, а с расширением .frm — схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.
В таблицах MyISAM могут быть фиксированные, динамические либо сжатые записи. Выбор между фиксированным и динамическим форматом диктуется определениями столбцов. Для создания сжатых таблиц предназначена отдельная утилита.
Недостатки
1.Отсутствие самовосстановления по журналу при сбоях (возможность присутствует во всех развитых СУБД).
2.Отсутствие блокировок регионов, меньших, чем целые таблицы, и как результат увеличение нагрузки на сервер.
3.Отсутствие средств резервного копирования, что объясняется тем что mysqldump, является не инструментом резервного копирования, а инструментом экспорта в текст.
4.Слабая реализация сортировки, которой является клауза ORDER BY языка SQL при отсутствии подходящего индекса, результатом чего может быть крах MySQL по сигналу SIGSEGV.
5.Данные недостатки проявляются в заметной степени при высокой нагрузке: порядка 400 клиентов, исполняющих сложные запросы по базе данных размером 2-3 ГБ.
InnoDB
Одна из выбираемых подсистем низкого уровня в СУБД MySQL, входит во все стандартные сборки для различных операционных систем. Основным отличием InnoDB от других подсистем низкого уровня MySQL является наличие механизма транзакций и внешних ключей.
Кратко о плюсах
1. Поддержка транзакций
2. Построчная блокировка. UPDATE не блокирует всю таблицу.
3. Отлично ведет себя при смешанной нагрузке (insert|select|update|delete)
Формат InnoDB был разработан для максимальной эффективности при обработке больших объемов данных (OLTP). А следовательно, он обеспечивает MySQL транзакционно-безопасным драйвером таблицы с поддержкой обработки нескольких запросов сразу, обратной перемотки и возможности восстановления после аварийного отказа. InnoDB обеспечивает блокировку на уровне строки и также обеспечивает Oracle-стиль непротиворечивым чтением без блокировки в операторах SELECT
, который увеличивает параллелизм транзакции.
В отличие от таблиц MyISAM, где для каждой таблицы создается один файл данных, данные InnoDB в настройках по умолчанию хранятся в больших совместно используемых файлах, что позволяет использовать постраничный кэш страниц базы данных. Формат данных InnoDB обеспечивает надежное хранение данных за счет транзакционности и блокировки данных на уровне строки.
Недостатки:
1. могут возникать deadlock, не свойственные MyISAM;
2. Медленнее выполняются insert операции и работа с блобами;
3. Не поддерживается полнотекстовый поиск;
4. Проблемы с производительностью COUNT(*);
5. Для Innodb нет поддержки mysqlhotcopy;
Вывод:
Писать о традиционном “Finish him!”, я думаю не совсем коректно, так как каждая система, создана для конкретных целей и судя по обработанной мной информации и опыту, у каждого все работат по разному. Для небольших проектов при ограниченных ресурсах, например на виртуальных серверах, MyISAM — довольно логичный выбор, т.к. включение поддержки InnoDB приведёт к необоснованно большому расходу памяти. Так же MyISAM следует использовать если:
- преобладают операции insert или select, но крайне мало delete или update.
- можно обойтись без транзакций.
- выполняются запросы, характерные для OLAP
- таблица используется для хранения лога (поддержка конкурирующих insert);
А InnoDB если:
- взаимодействие с базой имеет характер OLTP
- требуются транзакции.
- нужна высокая надежность хранения и быстрое восстановление после сбоя.
P.S. Окончательно может решить только дуель в Quake и ящик пива:)
Рубрика: Свободный софт
Авторы: Супрун О. В. (ДРЕ-КС9-1)
Опубликовано: 21.04.13 17:32