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

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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
48
0
55 615
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

Верен ли средний абзац? Похоже, что это противоречит принятому ответу. (то есть: размер указателя просто больше, а не дополнительный уровень косвенности)

user645280 27.07.2011 18:32

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

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

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

Ответ принят как подходящий

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

Эта страница indicates dynamic row format has significance for InnoDB as well.
steampowered 17.02.2012 17:08

Другая статья, указывающая на динамический формат строки, имеет значение для InnoDB: Хранилище BLOB-объектов в InnoDB - блог о производительности MySQL

Kaan 15.02.2013 13:15

Я протестировал вставку 10 тысяч записей в таблицу с ROW_SIZE = 282B. С InnoDB это заняло почти 500 секунд, с MyISAM и MEMORY это заняло около 2,97 секунды.

Victor 24.08.2015 12:24

@Victor - у вас, вероятно, был параметр, который синхронизирует с диском при каждой транзакции, и у вас, вероятно, была одна вставка для каждой транзакции. InnoDB может работать намного быстрее.

Rick James 14.04.2016 01:08

ИСПРАВЛЕНО удалено из MySQL 5.7 для InnoDb.

ColinM 28.09.2016 05:24

Эта страница в документации MySQL, похоже, противоречит верхнему ответу здесь, в этом ДИНАМИЧЕСКОМ формате строки означает что-то и для таблиц InnoDB:

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

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