Spec-Zone.ru › MySQL 5.7

15.2.3.2 Характеристики динамических таблиц

Динамический формат хранения используется, если таблица MyISAM содержит столбцы переменной длины (VARCHAR, VARBINARY, BLOB или TEXT), или если таблица была создана с опцией таблицы ROW_FORMAT=DYNAMIC.

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

Для дефрагментации таблицы можно использовать OPTIMIZE TABLE или myisamchk -r. Если у вас есть столбцы фиксированной длины, которые часто обращаются к или изменяются в таблице, содержащей также столбцы переменной длины, то может быть хорошей идеей перенести столбцы переменной длины в другие таблицы, чтобы избежать фрагментации.

Динамические таблицы имеют следующие характеристики:

  • Все строковые столбцы являются динамическими, за исключением столбцов с длиной меньше четырёх.

  • Каждая строка предваряется битовой картой, которая указывает, какие столбцы содержат пустую строку (для строковых столбцов) или ноль (для числовых столбцов). Это не включает столбцы, содержащие NULL значения. Если длина строкового столбца равна нулю после удаления завершающих пробелов, или числовой столбец имеет значение ноль, он помечается в битовой карте и не сохраняется на диск. Непустые строки сохраняются как байт длины плюс содержимое строки.

  • Столбцы NULL требуют дополнительного места в строке для записи того, являются ли их значения NULL. Каждый столбец NULL занимает один дополнительный бит, округлённый до ближайшего байта.

  • Обычно требуется меньше места на диске, чем для таблиц фиксированной длины.

  • Каждая строка использует только необходимое место. Однако, если строка становится больше, она разбивается на нужное количество фрагментов, что приводит к фрагментации строки. Например, если вы обновите строку информацией, увеличивающей её длину, строка фрагментируется. В этом случае может потребоваться время от времени запускать OPTIMIZE TABLE или myisamchk -r для повышения производительности. Используйте myisamchk -ei для получения статистических данных о таблице.

  • Их сложнее восстановить после сбоя, чем таблицы статического формата, поскольку строки могут быть фрагментированы на многие части, и ссылки (фрагменты) могут отсутствовать.

  • Ожидаемая длина строки для динамических строк вычисляется по следующему выражению:

    3
    + (number of columns + 7) / 8
    + (number of char columns)
    + (packed size of numeric columns)
    + (length of strings)
    + (number of NULL columns + 7) / 8
    

    Штраф за каждую ссылку составляет 6 байтов. Динамическая строка связана, когда обновление приводит к увеличению строки. Каждая новая ссылка имеет не менее 20 байтов, поэтому следующее увеличение, вероятно, попадает в ту же ссылку. Если нет, создаётся другая ссылка. Количество ссылок можно найти, используя myisamchk -ed. Все ссылки могут быть удалены с помощью OPTIMIZE TABLE или myisamchk -r.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/dynamic-format.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API