MyISAM storage engine в MySQL

MyISAM storage engine по умолчанию в старых версиях MySQL (до версии 5.5.5). Первоначально создавался для использования в web приложениях и хранилищах данных (Data Warehouse). Отсюда вытекают его основные особенности:

  • таблицы занимают мало места на диске и легко переносятся прямым копированием на другой хост, где также могут использоваться;
  • при загрузке данных в пустые таблицы неуникальные индексы могут отключаться на время загрузки и включаться после нее. Соответственно, это дает увеличение скорости загрузки;
  • возможность сжатия read-only таблиц для экономии места;
  • блокировки на уровне таблиц для изменения данных;
  • поддержка полнотекстового поиска (FULLTEXT search);
  • поддержка пространственных данных;
  • возможность ограничения количества строк на таблицу для улучшения производительности.

В файловой системе каждая из таблиц MyISAM представлена 3 файлами:

  • Format file: сохраняет описание структуры таблицы (mytable.frm);
  • Data file: Сохраняет содержимое строк таблицы (mytable.MYD);
  • Index file: Сораняет любые индексы на таблицу (mytable.MYI).

Существует три формата таблиц в MyISAM:

  1. Fixed-row format (Static):
    – все строки имеют одинаковый размер. Следовательно, их можно быстрее считывать, т.к. позиция начала любой строки кратна ее размеру.
    – строки фиксированного формата требуют больше места для хранения, значит и для хранения таблицы тоже потребуется больше места.
    – все колонки таблицы должны иметь фиксированный размер. Если в таблице нет колонок: VARCHAR, VARBINARY, BLOB, TEXT, то этот формат хранения устанавливается автоматически. Если же такие столбцы в таблице существуют и мы принудительно указажем такой формат хранения таблицы, то поля VARCHAR будет дополняться пробелами, VARBINARY – нулями и т.п.
  2. Dynamic-row format:
    – строки имеют разную длину, как это и следует из названия. Пустые строки или нуль (не NULL) не занимают места. Такие таблицы, как правило, занимают меньше места на диске.
    – работа со строками менее эффектвна, чем в предыдущем случае.
    – строки автоматически фрагментируются при операциях UPDATE. Следовательно, надо периодически делать дефрагментацию с помощью команды OPTIMIZE TABLE.
    – таблицы менее надежны при сбоях. Могут также возникнуть проблемы при их восстановлении.
  3. Compressed format:
    – таблицы MyISAM могут быть fixed или dynamic формата и по умолчанию они не сжаты. Для того, чтобы получить сжатые таблицы (compressed format) используется утилита myisampack.
    – таблицы этого формата read-only, для того, чтобы сделать UPDATE, INSERT, ALTER необходимо провести их декомпрессию, а потом опять сжать.
    – только для ограниченного числа приложений имеет смысл использовать этот формат.

Блокировки в MyISAM.

Немного подробнее про блокировки в данном движке.

  • Блокировка возможна на уровне таблиц. Понятно, что это не так хорошо, как блокировки на уровне строк или страниц.
  • При запросах возникают неявные (implicit) блокировки, но есть возможность выставлять явные блокировки на таблицы MyISAM с помощью команд LOCK TABLES/UNLOCK TABLES.
  • Если в таблице нет “дырок” (holes или gaps), то поддерживаются concurrent (одновременно происходящие) insert-ы. Соответственно, при наличии таких “дырок”, такие insert-ы не поддерживаются. Но не все так грустно. С помощью команды OPTIMIZE TABLE можно провести дефрагментацию таблицы и убрать такие “дырки”.
  • кроме того, установка параметра concurrent_insert в значение 2 позволяет выполнять одновременные insert-ы, даже несмотря на наличие “дырок”. Данные при этом пишутся в конец таблицы.

 Приоритет блокировок в MyISAM.

И в заключении пара слов про приоритет блокировок. Операторы записи (UPDATE и DELETE) имеют более высокий приоритет, чем операторы чтения (SELECT). Если таблица читается в момент записи, операторы записи будут ждать окончания чтения. Но вот новые запущенные операторы чтения будут уже ожидать окончания записи даже, если текущие операторы чтения еще не прошли, т.к. их приоритет ниже, чем у ждущих операторов записи.

Приоритет операций можно изменять, если это будет Вам необходимо с помощью следующих ключей:

  • LOW_PRIORITY используется, чтобы понизить приоритет операций по изменению данных в таблице;
  • HIGH_PRIORITY используется для повышения приоритета команды SELECT над операциями записи и другими SELECT-ами. Например, SELECT HIGH_PRIORITY … FROM ставит в очередь данный SELECT над ждущими операциями UPDATE и другими ждущими SELECT-ами;
  • DELAYED используется для сохранение в памяти записываемых строк. Как только таблица освободиться, эти строки будут в нее записаны. Если во время выполнения этой операции произошел сбой в системе, данные могут быть потеряны.

Оглавление.

Leave a Reply

Your email address will not be published. Required fields are marked *