MySQL Row Format: разница между фиксированной и динамической?

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

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

5 ответов

Решение

Разница действительно имеет значение только для 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

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

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

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

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

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

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

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

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

Другие вопросы по тегам