Открыть сервис

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

ХарактеристикаMyISAMInnoDB
Транзакции (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 →