Должны ли столбцы VARCHAR помещаться в конце определений таблиц в MySQL? - PullRequest
7 голосов
/ 26 мая 2011

Я слышал (от коллеги, который слышал это от другого разработчика), что столбцы VARCHAR всегда должны помещаться в конец определения таблицы в MySQL, потому что они имеют переменную длину и поэтому могут замедлять запросы.

Исследование, которое я провел в отношении переполнения стека, похоже, противоречит этому и предполагает, что порядок столбцов важен, хотя существует разное согласие относительно того, насколько это применимо к VARCHAR.

Он не был 't конкретно о механизмах хранения или о том, применяется ли это только к столбцам VARCHAR, к которым редко обращаются.

Ответы [ 2 ]

8 голосов
/ 26 мая 2011

Задавать этот вопрос о «MySQL» бесполезно, поскольку MySQL передает хранилище механизмам хранения, и они реализуют хранилище совершенно по-разному. Имеет смысл задать этот вопрос для любого отдельного механизма хранения.

В механизме MEMORY типы данных переменной длины не существуют. VARCHAR молча превращается в CHAR. В контексте вашего вопроса: не имеет значения, где в определении таблицы вы поместили свой VARCHAR.

В движке MyISAM, если таблица не имеет данных переменной длины (VARCHAR, VARBINARY или любого типа TEXT или BLOB), она имеет ИСПРАВЛЕННЫЙ вариант MyISAM, то есть записи имеют фиксированную длину байта. Это может повлиять на производительность, особенно если данные удаляются и вставляются повторно (то есть таблица не только добавляется). Как только любой тип данных переменной длины становится частью определения таблицы, он становится DYNAMIC-вариантом MyISAM, а MyISAM внутренне заменяет любой, кроме самого короткого типа CHAR, на VARCHAR. Опять же, положение и даже определение CHAR / VARCHAR не имеют значения.

В движке InnoDB данные хранятся на страницах размером 16 КБ. Страница имеет нижний колонтитул страницы с контрольной суммой, а также верхний колонтитул страницы, среди прочего, каталог страницы. Каталог страницы содержит для каждой строки смещение этой строки относительно начала страницы. Страница также содержит свободное пространство, и все операции ввода-вывода выполняются в страницах.

Следовательно, InnoDB может, до тех пор, пока на странице есть свободное пространство, наращивать VARCHAR на месте и перемещать строки внутри страницы без дополнительных операций ввода-вывода. Кроме того, поскольку все строки рассматриваются как (номер страницы, запись в каталоге страниц), перемещение строки внутри страницы локализуется на странице и не видно снаружи.

Это также означает, что и для InnoDB порядок столбцов внутри строки вообще не имеет значения.

Это три механизма хранения, которые чаще всего используются с MySQL, и порядок столбцов не имеет значения для любого из этих трех. Возможно, существуют другие, более экзотические механизмы хранения, для которых это не так.

3 голосов
/ 26 мая 2011

Неважно. А некоторые движки хранят типы varlena в отдельной области (например, TOAST в Postgres).

Более того, логический порядок (то, что вы видите при выборе *) может фактически отличаться от физического порядка (как он хранится, который основан на порядке, в котором вы создали фактические столбцы, используя последующие операторы таблицы изменений) .

http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx

...