Формат строки MySQL: разница между фиксированным и динамическим?

MySQL определяет формат строки таблицы как фиксированный или динамический, в зависимости от типов данных столбца. Если таблица имеет тип данных столбца переменной длины, например TEXT или VARCHAR, формат строки является динамическим; в противном случае он фиксирован.

мой вопрос в том, в чем разница между двумя форматами строк? Один эффективнее другого?

5 ответов


разница действительно имеет значение только для MyISAM, другие двигатели хранения не заботятся о разнице. изменить : многие пользователи прокомментировали, что InnoDB заботится:ссылка 1 по steampowered, Ссылка 2 по Kaan.

с MyISAM с фиксированной шириной строк, есть несколько преимуществ:

  1. нет фрагментации строк: с помощью строк переменной ширины можно получить отдельные строки, разделенные на несколько разделов по данным файл. Это может увеличить поиск диска и замедлить операции. Можно дефрагментировать его с помощью таблицы OPTIMIZE, но это не всегда практично.

  2. размер указателя файла данных: в MyISAM существует концепция указателя файла данных, который используется, когда ему нужно ссылаться на файл данных. Например, это используется в индексах, когда они ссылаются на то, где фактически присутствует строка. При фиксированных размерах ширины этот указатель основан на смещении строки в файле (т. е. строки 1, 2, 3 независимо от их размера). При переменной ширине указатель основан на смещении байта(т. е. строк может быть 1, 57, 163). В результате при больших таблицах указатель должен быть больше, что потенциально добавляет к таблице гораздо больше накладных расходов.

  3. легче исправить в случае коррупции. Поскольку каждая строка имеет одинаковый размер, если ваша таблица MyISAM повреждена, ее намного проще восстановить, поэтому вы потеряете только те данные, которые действительно повреждены. С переменная ширина, теоретически возможно, что указатели переменной ширины перепутались, что может привести к плохому поливу данных.

теперь основным недостатком фиксированной ширины является то, что она тратит больше места. Например, вам нужно использовать поля CHAR вместо полей VARCHAR, поэтому вы получаете дополнительное пространство.

обычно у вас не будет большого выбора в формате, так как он продиктован на основе схемы. Тем не менее, это может стоить, если вы есть только несколько varchar или один blob / text, чтобы попытаться оптимизировать к этому. Например, подумайте о переключении единственного varchar в char или разделите blob на его собственную таблицу.

вы можете прочитать еще больше об этом:

http://dev.mysql.com/doc/refman/5.0/en/static-format.html

http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html


одно ключевое различие возникает при обновлении записи. Если формат строки фиксирован, длина записи не изменяется. Напротив, если формат строки динамический и новые данные приводят к увеличению длины записи, ссылка используется для указания на данные "переполнения" (т. е. она называется указателем переполнения).

Это фрагментирует таблицу и, как правило, замедляет работу. Существует команда для дефрагментации (оптимизировать таблицу), которая несколько смягчает вопрос.


эта страница в документации MySQL, похоже, противоречит верхнему ответу здесь, в этом динамическом формате строки означает что-то для таблиц InnoDB:

http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html


fixed означает, что каждая строка имеет точно такой же размер. Это означает, что если 3-я строка на странице данных должна быть загружена, она будет находиться точно в PageHeader+2*RowSize, экономя некоторое время доступа.

чтобы найти начало динамической записи, необходимо ознакомиться со списком смещений записи, что включает в себя дополнительную косвенность.

короче говоря, да, есть небольшой хит производительности для динамических строк. Нет, он не очень большой. Если вы думаете, что это будет проблема, тест на это.


Fixed должен быть быстрее и безопаснее, чем dynamic, с недостатком наличия фиксированной длины char. Вы можете найти эту информацию здесь:http://dev.mysql.com/doc/refman/5.0/en/static-format.html