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

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

Мой вопрос в том, какая разница между форматами двух строк? Является ли более эффективным, чем другой?

Ответ 1

Разница действительно имеет значение только для MyISAM, другие механизмы хранения не заботятся о разнице. ОБНОВЛЕНИЕ: Многие пользователи отметили, что InnoDB действительно заботится: ссылка 1 -, ссылка 2 - Каан.

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

Ответ 4

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

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

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

Ответ 5

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