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

StackOverflow https://stackoverflow.com/questions/147315

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top