Данный формат используется для таблиц, которые содержат столбцы VARCHAR
,
BLOB
или TEXT
, а также если таблица была создана с параметром
ROW_FORMAT=dynamic
.
Это несколько более сложный формат, так как у каждой строки есть заголовок, в котором указана ее длина. Одна запись может заканчиваться более чем в одном месте, если она была увеличена во время обновления.
Чтобы произвести дефрагментацию таблицы, можно воспользоваться командами
OPTIMIZE table
или myisamchk
. Если у вас есть статические данные, которые
часто считываются/изменяются в некоторых столбцах VARCHAR
или BLOB
одной и
той же таблицы, во избежание фрагментации эти динамические столбцы лучше
переместить в другие таблицы. Свойства динамических таблиц следующие:
Все столбцы со строками являются динамическими (кроме тех, у которых длина меньше 4).
Перед каждой записью помещается битовый массив, показывающий, какие столбцы пусты (
''
) для строковых столбцов, или ноль для числовых столбцов (это не то же самое, что столбцы, содержащие значениеNULL
). Если длина строкового столбца равна нулю после удаления пробелов в конце строки, или у числового столбца значение ноль, он отмечается в битовом массиве и не сохраняется на диск. Строки, содержащие значения, сохраняются в виде байта длины и строки содержимого.Обычно такие таблицы занимают намного меньше дискового пространства, чем таблицы с фиксированной длиной.
Для всех записей используется ровно столько места, сколько необходимо. Если размер записи увеличивается, она разделяется на несколько частей - по мере необходимости. Это приводит к фрагментации записей.
Если в строку добавляется информация, превышающая длину строки, строка будет фрагментирована. В этом случае для увеличения производительности можно время от времени запускать команду
myisamchk -r
. Чтобы получить статистические данные, воспользуйтесь командойmyisamchk -ei tbl_name
.Восстановление после сбоя для таких таблиц является более сложным процессом, так как запись может быть фрагментированной и состоять из нескольких частей, а ссылка (или фрагмент) могут отсутствовать.
-
Предполагаемая длина строки для динамических записей вычисляется следующим образом:
3 + (число столбцов+ 7) / 8 + (число столбцов char) + размер числовых столбцов в упакованном виде + длина строк + (число столбцов NULL + 7) / 8
На каждую ссылку добавляется по 6 байтов. Динамические записи связываются при каждом увеличении записи во время обновления. Каждая новая ссылка занимает по крайней мере 20 байтов, поэтому следующее увеличение может произойти либо по этой же ссылке; либо по другой, если не хватит места. Количество ссылок можно проверить при помощи команды
myisamchk -ed
. Все ссылки можно удалить при помощи командыmyisamchk -r
.