MySQL Row Format: разница между фиксированной и динамической? - PullRequest
45 голосов
/ 29 сентября 2008

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

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

Ответы [ 5 ]

57 голосов
/ 29 сентября 2008

Разница действительно имеет значение только для MyISAM, другие механизмы хранения не заботятся о разнице. РЕДАКТИРОВАТЬ: Многие пользователи отметили, что InnoDB заботится: ссылка 1 от steampowered , ссылка 2 от Kaan .

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

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

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

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

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

Как правило, у вас не будет большого выбора в формате, поскольку он продиктован на основе схемы. Тем не менее, это может быть полезно, если у вас есть только несколько varchar или один blob / text, чтобы попытаться оптимизировать это. Например, рассмотрите возможность переключения единственного varchar на символ или разбейте 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

10 голосов
/ 29 сентября 2008

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

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

7 голосов
/ 14 февраля 2012

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

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

4 голосов
/ 29 сентября 2008

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

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

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

1 голос
/ 29 сентября 2008

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

...