MyISAM
MyISAM — это одна из систем хранения данных (storage engine) для СУБД MySQL. Она была стандартной и наиболее распространённой до появления InnoDB. MyISAM обеспечивает высокую скорость выполнения операций чтения, но не поддерживает транзакции, внешние ключи и отказоустойчивость на уровне строк.
История
MyISAM была разработана компанией MySQL AB в конце 1990-х годов как улучшенная версия старой системы хранения ISAM (Indexed Sequential Access Method). Первоначально она была реализована в MySQL 3.23 и стала движком по умолчанию на протяжении многих лет. Её основное преимущество — простота и высокая производительность при чтении данных, что делало её идеальной для веб-приложений, где преобладают операции SELECT.
С выходом MySQL 5.5 (2010 год) разработчики MySQL (тогда уже принадлежавшей Oracle) сделали InnoDB движком по умолчанию. Это было связано с тем, что InnoDB поддерживает транзакции (ACID), внешние ключи и более надёжное восстановление после сбоев. Тем не менее, MyISAM остаётся доступной и используется в ряде сценариев, где транзакционность не требуется, а скорость чтения критична.
Архитектура и устройство
MyISAM хранит каждую таблицу в трёх файлах на диске:
.frm— файл определения структуры таблицы (содержит метаданные о колонках, индексах и т. д.)..MYD— файл данных (собственно строки таблицы)..MYI— файл индексов (структуры для быстрого поиска).
Формат хранения данных
Данные в MyISAM хранятся в одном из трёх форматов:
- Фиксированная длина строки (Fixed-length) — все строки имеют одинаковую длину. Это самый быстрый формат, но он неэффективен для хранения текстовых полей переменной длины (например, VARCHAR).
- Динамическая длина строки (Dynamic-length) — строки могут иметь разную длину. Экономит место, но медленнее при обновлениях, так как может потребоваться фрагментация.
- Сжатый формат (Compressed) — данные сжимаются с помощью алгоритма zlib. Используется для неизменяемых таблиц (например, архивов). Чтение из сжатых таблиц возможно, но медленнее, чем из несжатых.
Индексы
MyISAM поддерживает только некластеризованные индексы. Это означает, что индекс и данные хранятся отдельно. При поиске по индексу сначала находится запись в файле .MYI, а затем по физическому адресу (номеру строки) извлекается соответствующая строка из файла .MYD. Индексы могут быть построены по любому столбцу или комбинации столбцов, включая текстовые поля с префиксным индексированием.
Ключевые особенности
- Отсутствие поддержки транзакций — MyISAM не реализует механизмы ACID. Если запрос прерывается (например, из-за сбоя питания), таблица может остаться в несогласованном состоянии.
- Блокировки на уровне таблиц — при выполнении операций записи (INSERT, UPDATE, DELETE) вся таблица блокируется для других сессий. Это может приводить к снижению производительности в многопользовательских средах с высокой нагрузкой на запись.
- Высокая скорость чтения — благодаря простой архитектуре и отсутствию транзакционных накладных расходов MyISAM очень быстр при выполнении SELECT-запросов.
- Поддержка полнотекстового поиска — MyISAM имеет встроенную поддержку полнотекстовых индексов (FULLTEXT), что позволяет эффективно искать по текстовым полям.
- Сжатие таблиц — возможность создавать сжатые, неизменяемые таблицы, что экономит дисковое пространство.
- Отсутствие поддержки внешних ключей — целостность ссылок должна обеспечиваться на уровне приложения.
- Автоинкремент — поддерживается, но не так гибок, как в InnoDB (например, нельзя установить начальное значение для каждой сессии).
Сравнение с InnoDB
| Характеристика | MyISAM | InnoDB |
|---|---|---|
| Транзакции (ACID) | Нет | Да |
| Блокировки | Табличные | Строчные |
| Внешние ключи | Нет | Да |
| Полнотекстовый поиск | Да (встроенный) | Да (с MySQL 5.6) |
| Сжатие | Да (только для неизменяемых таблиц) | Да (с MySQL 5.7) |
| Восстановление после сбоя | Медленное (требует проверки таблиц) | Быстрое (журнал транзакций) |
| Производительность чтения | Высокая | Средняя |
| Производительность записи | Средняя (из-за блокировок) | Высокая (при строчных блокировках) |
| Хранение данных | Отдельные файлы (.frm, .MYD, .MYI) | Единое табличное пространство (или файлы на таблицу) |
Применение
MyISAM чаще всего используется в следующих сценариях:
- Чтение-ориентированные приложения — например, каталоги товаров, блоги, форумы, где операции чтения значительно преобладают над записями.
- Хранилища логов и аналитики — где данные записываются редко, но часто читаются.
- Архивные таблицы — сжатые таблицы, которые не изменяются после создания.
- Полнотекстовый поиск — в старых версиях MySQL (до 5.6) только MyISAM поддерживал FULLTEXT-индексы.
Недостатки и ограничения
- Отсутствие отказоустойчивости — при сбое сервера данные могут быть повреждены. Требуется регулярная проверка таблиц с помощью
CHECK TABLEиREPAIR TABLE. - Блокировки на уровне таблиц — при высокой конкурентной записи производительность резко падает.
- Нет поддержки внешних ключей — целостность данных должна контролироваться на уровне приложения, что может приводить к ошибкам.
- Фрагментация — при частых вставках и удалениях строк таблица может фрагментироваться, что замедляет чтение. Требуется периодическая дефрагментация (
OPTIMIZE TABLE).
Интересные факты
- MyISAM была разработана на основе более старой системы ISAM, которая использовалась в dBase и FoxPro.
- В MySQL 8.0 MyISAM всё ещё присутствует, но считается устаревшей (deprecated) и не рекомендуется к использованию в новых проектах. В будущих версиях её могут удалить.
- Некоторые популярные CMS (например, WordPress) в ранних версиях использовали MyISAM по умолчанию, но позже перешли на InnoDB.
Источники
- MySQL Documentation: MyISAM Storage Engine
- MySQL 5.7 Reference Manual: MyISAM Tables
- MySQL 8.0 Reference Manual: MyISAM Storage Engine (Deprecated)
- «High Performance MySQL» (Baron Schwartz, Peter Zaitsev, Vadim Tkachenko)
- Официальная документация Oracle MySQL
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →