Будучи подсистемой хранения по умолчанию в MySQL 5.1 и более ранних версиях, MyISAM предоставляет большой список функций, таких как полнотекстовое индексирование, сжатие и пространственные функции (для геоинформационных систем, ГИС). MyISAM не поддерживает транзакции или построчные блокировки. Ее самым слабым местом, несомненно, является то, что она не имеет даже удаленного механизма защиты от сбоев. Из-за подсистемы MyISAM MySQL до сих пор имеет репутацию СУБД без транзакций, хотя позволяет использовать транзакции уже более десяти лет! Тем не менее MyISAM не так уж плоха для нетранзакционной, не отказоустойчивой подсистемы хранения. Если вам нужны данные только для чтения или если ваши таблицы невелики и их восстановление не будет чересчур сложным, то не должно возникнуть вопросов по использованию MyISAM. (Но, пожалуйста, не применяйте ее по умолчанию. Вместо этого задействуйте InnoDB).
Хранение
MyISAM обычно хранит каждую таблицу в двух файлах — в файле данных и индексном файле. Эти файлы имеют расширения .MYD
и .MYI
соответственно. Таблицы типа MyISAM могут содержать как динамические, так и статические строки (строки фиксированной длины). MySQL решает, какой формат использовать, основываясь на определении таблицы. Количество строк в таблице типа MyISAM ограничено в первую очередь доступным дисковым пространством на сервере базы данных и максимальным размером файла, допустимым в операционной системе.
Таблицы MyISAM со строками переменной длины, создаваемые в версии MySQL 5.0, по умолчанию настроены на поддержку 256 Тбайт данных с использованием шестибайтных указателей на записи с данными. В более ранних версиях MySQL указатели по умолчанию были четырехбайтными с максимальным объемом данных 4 Гбайт. Все версии MySQL могут поддерживать размер указателя до 8 байт. Чтобы изменить размер указателя в таблице MyISAM (уменьшить или увеличить), вы должны изменить таблицу и задать новые значения параметров MAX_ROWS
и AVG_ROW_LENGTH
, которые дают приблизительную оценку необходимого пространства. Это приведет к перезаписи таблицы и всех ее индексов, что может занять много времени.
Особенности MyISAM
Как одна из самых старых подсистем хранения MySQL, MyISAM может выполнять много функций, которые за годы использования СУБД были разработаны для решения различных задач.
- Блокирование и конкурентный доступ. MyISAM может блокировать только таблицы целиком, не построчно. Запросы на чтение получают разделяемые (на чтение) блокировки всех таблиц, которые им нужно прочитать. Запросы на запись получают монопольные (на запись) блокировки. Однако вы можете вставлять новые строки в таблицу в то время, когда исполняются запросы на выборку данных из таблицы (конкурентные вставки).
- Исправление данных. MySQL поддерживает ручные и автоматические проверку и исправление таблиц типа MyISAM, но не стоит путать эти функции с транзакциями или аварийным восстановлением. После исправления таблицы вы, скорее всего, обнаружите, что некоторые данные просто исчезли. К тому же исправление работает очень медленно. Вы можете применять команды
CHECK TABLE mytable
иREPAIR TABLE mytable
для проверки таблицы на предмет наличия ошибок и их устранения. А также использовать командную утилиту myisamchk для проверки и исправления таблиц, когда сервер находится в автономном (offline) режиме. - Особенности индексирования. Вы можете создавать индексы по первым 500 символам столбцов типа BLOB и TEXT в таблицах MyISAM. MyISAM поддерживает полнотекстовые индексы, которые индексируют отдельные слова для сложных операций поиска.
- Отложенная запись ключей. Таблицы MyISAM, созданные с пометкой
DELAY_KEY_ WRITE
, не записывают измененные индексы на диск в конце запроса. Вместо этого MyISAM сохраняет изменения в буфере памяти для ключей. Сброс индексных блоков на диск происходит при переполнении буфера или закрытии таблицы. Это позволяет увеличить производительность, но в случае сбоя сервера или системы индексы наверняка будут повреждены и потребуют восстановления. Вы можете настроить отложенную запись ключей как для всей базы, так и для отдельных таблиц.
Сжатые таблицы MyISAM
Некоторые таблицы после создания и заполнения данными никогда больше не изменяются. Такие таблицы хорошо подходят для сжатия средствами MyISAM.
Для сжатия (или упаковки) таблиц существует специальная утилита myisampack. Сжатые таблицы невозможно изменить (хотя при необходимости можно распаковать их, внести изменения и снова сжать), но они занимают на диске гораздо меньше места, чем неупакованные. В результате их использования увеличивается производительность, поскольку из-за небольшого размера таких таблиц требуется меньше операций поиска на диске для нахождения требуемых записей. Сжатые таблицы MyISAM могут иметь индексы, но они также доступны только для чтения.
Издержки на распаковку данных для чтения незначительны для большинства приложений, установленных на современном оборудовании, а значительная экономия достигается из-за сокращения операций ввода/вывода. Строки сжимаются по отдельности, поэтому для получения одной строки MySQL не нужно распаковывать всю таблицу (или даже страницу).
Производительность MyISAM
Благодаря компактному хранению данных и невысоким издержкам, обусловленным простотой архитектуры, MyISAM в некоторых случаях может обеспечить хорошую производительность. У нее есть серьезные ограничения по масштабируемости, включая мьютексы, установленные на ключевых кэшах. MariaDB предлагает сегментированный кэш-ключ, который позволяет избежать этой проблемы. Однако наиболее распространенной проблемой MyISAM, мешающей добиться высокой производительности, является блокировка таблиц. Если запросы застревают в статусе «Заблокировано», вы страдаете от блокировки на уровне таблицы.