MyISAM

Тип |  СУБД (Storage Engine для MySQL)
Разработчик |  Oracle
Написана на |  Си
Лицензия |  GPLv2
Сайт |  dev.mysql.com/doc… (англ.)

MyISAM — одна из основных (наряду с InnoDB) систем хранения данных в СУБД MySQL. Она основывается на принципах ISAM и обладает в сравнении с ним рядом полезных дополнений. Поддерживается с версий MySQL 3.x, до версий MySQL 5.5 являлась системой хранения по умолчанию. MyISAM имеет возможности по сжатию данных, по созданию полнотекстовых индексов, однако, не является устойчивой к сбоям и не выполняет требования ACID.[1]

## Содержание

* 1 Описание
* 2 Недостатки
* 3 Примечания
* 4 Ссылки

## Описание

[править | править код]

Таблицы MyISAM прекрасно подходят для использования в небольших интернет-проектах (WWW) и других средах, где преобладают запросы на чтение и нет жестких требований к надежности. Таблицы типа MyISAM показывают относительно хорошие результаты при выборках данных (запросы SELECT). Во многом это связано с отсутствием поддержки транзакций и внешних ключей. Однако при модификации и добавлении записей вся таблица кратковременно блокируется, это может привести к серьёзным задержкам при большой загрузке.

Для таблиц этого типа создан ряд специализированных утилит, позволяющих манипулировать табличными файлами. Сюда входят утилита myisamchk для проверки и восстановления таблиц и индексов (требует полной остановки процесса MySQL и создает время неработоспособности системы, исполнение заключается в создании с нуля нового целостного файла таблицы и перезаписи данных в него) и утилита myisampack для создания сжатых таблиц.

Таблицы MyISAM являются платформенно-независимыми. Табличные файлы можно перемещать между компьютерами разных архитектур и разными операционными системами без всякого преобразования. Для этого MySQL хранит все числа с плавающей запятой в формате IEEE, а все целые числа — в формате с прямым[источник не указан 1299 дней] порядком следования байтов.

Индексные файлы имеют расширение .MYI (MYIndex). Файлы с расширением .MYD (MYData) содержат данные, а с расширением .frm — схему таблицы. Если индексный файл по какой-то причине теряется, программа перестраивает индексы, используя информацию из frm-файла.

По умолчанию в каждой таблице может быть не более тридцати двух индексов, но это значение можно повысить до шестидесяти четырёх. Индексы создаются в виде двоичных деревьев. Разрешается индексировать столбцы типа BLOB и TEXT, и столбцы, допускающие значения NULL.

В таблицах MyISAM могут быть фиксированные по длине, динамические либо сжатые записи. Выбор между фиксированным и динамическим форматом диктуется определениями столбцов. Для создания сжатых таблиц предназначена утилита myisampack.

## Недостатки

[править | править код]

* Отсутствует поддержка транзакций и внешних ключей.
* Отсутствие самовосстановления по журналу при сбоях (возможность присутствует во всех развитых СУБД).
* Отсутствие блокировок регионов, меньших, чем целые таблицы. Приводит к отсутствию масштабируемости, то есть к сильной деградации производительности с повышением нагрузки.
* Отсутствие средств резервного копирования. Утилита mysqldump, предлагаемая для создания резервных копий, является не инструментом резервного копирования, а инструментом экспорта в текст (в последовательность операторов INSERT, воссоздающих содержимое таблицы). Для выполнения задачи с сохранением целостности базы данных mysqldump блокирует таблицы, приводя к полной остановке работы системы на всё время своего исполнения.
* Для лучшей работы оптимизатора запросов может потребоваться периодическое исполнение команды ANALYZE.
* Слабая реализация сортировки, при использовании предложения ORDER BY языка SQL и отсутствии подходящего индекса. MyISAM сортирует данные слиянием, с использованием qsort для первоначально сливаемых небольших регионов. Это требует не только крайне неоптимального по дисковому вводу-выводу создания на каждую операцию сортировки 2 временных файлов, растущих с нулевого размера, с работой с ними через неоптимальные вызовы fopen() и fwrite(), но и выделения sort buffer для каждого клиента MySQL. Размер sort buffer (устанавливается параметром настройки MySQL sort_buffer_size) для достижения оптимальной производительности должен быть порядка сотен килобайт, что под большой нагрузкой приводит к полному исчерпанию не только кучи, но и пользовательского адресного пространства в 32-битных ОС семейства UNIX (во FreeBSD на x86 — 3 ГБ), и влечет за собой отказы вызовов malloc() во всем коде MySQL, а не только в коде сортировки. Поскольку во всем исходном коде MySQL (а не только MyISAM) вызовы malloc() зачастую забывают проверяться на ошибки, это влечет за собой крах всего mysqld, что как правило приводит к разрушению индексов, которые приходится пересоздавать вручную. В редких случаях такой крах может привести и к повреждению таблицы с утратой данных.

Данные недостатки проявляются в заметной степени при высокой нагрузке: более 400 клиентов, исполняющих сложные запросы по базе данных размером 2-3 ГБ.

## Примечания

[править | править код]

1. ↑ Percona Live New York 2011  (неопр.). Дата обращения: 20 августа 2014. Архивировано 26 февраля 2015 года.

## Ссылки

[править | править код]

* MySQL Documentation on MyISAM Storage Engine (англ.)

* MySQL 5.5: Storage Engine Performance. Benchmark for MyISAM and InnoDB // A MySQL Technical White Paper, January 2011 (англ.)
* The Definitive Guide to MySQL 5 (Michael Kofler), page 138 "MyISAM Tables" (англ.)

MySQL

Версии|

* MySQL
* MySQL Enterprise
* MySQL Cluster

Инструменты|

* MySQL Workbench
* phpMyAdmin
* MySQL proxy
* HeidiSQL
* Navicat

Движки|

* MyISAM
* Falcon
* InnoDB
* XtraDB
* MySQL Federated
* MySQL Archive
* Maria
* Aria

Форки|

* Drizzle
* MariaDB
* Percona Server

Системы управления базами данных (СУБД)

Клиент-серверные|

* Caché
* CouchDB
* IMS
* DB2
* Firebird
* FoundationDB
* Informix
* Ingres
* Interbase
* MS SQL Server
* MongoDB
* MySQL
* mSQL
* Neo4j
* Oracle Database
* Pervasive SQL
* PostgreSQL
* Sybase ASE
* Sybase ASA
* Sybase IQ
* Teradata Database
* ЛИНТЕР
* Yandex Database
* СУБД Ред База Данных

Движки|

* BDE
* Berkeley DB
* C-Store
* db4o
* HSQLDB
* Mnesia
* PrimeBase
* Redis
* Rdb
* SQLite
* ZODB

Файл-серверные|

* DataFlex
* dBase
* MS Access
* OpenOffice Base
* Paradox