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






Фиксированный означает, что все строки имеют одинаковый размер. Это означает, что если необходимо загрузить 3-ю строку на странице данных, она будет иметь размер PageHeader + 2 * RowSize, что сэкономит время доступа.
Чтобы найти начало динамической записи, необходимо обратиться к списку смещений записи, что требует дополнительного косвенного обращения.
Короче говоря, да, есть небольшое снижение производительности для динамических строк. Нет, не очень большой. Если вы думаете, что это будет проблемой, проверьте ее.
Одно ключевое отличие возникает при обновлении записи. Если формат строки фиксированный, длина записи не изменяется. Напротив, если формат строки является динамическим и новые данные вызывают увеличение длины записи, используется ссылка для указания на данные «переполнения» (т.е. она называется указателем переполнения).
Это фрагментирует таблицу и обычно замедляет работу. Есть команда для дефрагментации (OPTIMIZE TABLE), которая несколько смягчает проблему.
Фиксированный должен быть быстрее и безопаснее, чем динамический, с недостатком фиксированной длины символа. Вы можете найти эту информацию здесь: http://dev.mysql.com/doc/refman/5.0/en/static-format.html
Разница действительно имеет значение только для MyISAM, другие механизмы хранения не заботятся о разнице. РЕДАКТИРОВАТЬ : Многие пользователи отметили, что InnoDB действительно заботится: ссылка 1 автор steampowered, ссылка 2 от Kaan.
MyISAM с рядами фиксированной ширины дает несколько преимуществ:
Отсутствие фрагментации строк: с помощью строк переменной ширины можно разделить отдельные строки на несколько разделов в файле данных. Это может увеличить количество обращений к диску и замедлить работу. Его можно дефрагментировать с помощью OPTIMIZE TABLE, но это не всегда практично.
Размер указателя файла данных: в MyISAM существует концепция указателя файла данных, который используется, когда ему нужно ссылаться на файл данных. Например, это используется в индексах, когда они относятся к тому, где фактически находится строка. При фиксированных размерах ширины этот указатель основан на смещении строки в файле (т. Е. Строки имеют размер 1, 2, 3 независимо от их размера). При переменной ширине указатель основан на байтовом смещении (т. Е. Строки могут быть 1, 57, 163). В результате для больших таблиц указатель должен быть больше, что потенциально увеличивает накладные расходы для таблицы.
Легче исправить в случае повреждения. Поскольку все строки имеют одинаковый размер, если ваша таблица MyISAM будет повреждена, ее будет намного легче восстановить, поэтому вы потеряете только данные, которые действительно повреждены. При переменной ширине теоретически возможно, что указатели переменной ширины испорчены, что может привести к неправильному размещению данных.
Главный недостаток фиксированной ширины в том, что она тратит больше места. Например, вам нужно использовать поля CHAR вместо полей VARCHAR, поэтому вы получите дополнительное пространство.
Обычно у вас не будет особого выбора формата, поскольку он определяется схемой. Однако, возможно, стоит попытаться оптимизировать это, если у вас есть всего несколько varchar или один blob / text. Например, рассмотрите возможность переключения единственной переменной 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
Другая статья, указывающая на динамический формат строки, имеет значение для InnoDB: Хранилище BLOB-объектов в InnoDB - блог о производительности MySQL
Я протестировал вставку 10 тысяч записей в таблицу с ROW_SIZE = 282B. С InnoDB это заняло почти 500 секунд, с MyISAM и MEMORY это заняло около 2,97 секунды.
@Victor - у вас, вероятно, был параметр, который синхронизирует с диском при каждой транзакции, и у вас, вероятно, была одна вставка для каждой транзакции. InnoDB может работать намного быстрее.
ИСПРАВЛЕНО удалено из MySQL 5.7 для InnoDb.
Эта страница в документации MySQL, похоже, противоречит верхнему ответу здесь, в этом ДИНАМИЧЕСКОМ формате строки означает что-то и для таблиц InnoDB:
https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html
Верен ли средний абзац? Похоже, что это противоречит принятому ответу. (то есть: размер указателя просто больше, а не дополнительный уровень косвенности)