Каковы оптимальные размеры varchar для MySQL? - PullRequest
64 голосов
/ 20 июля 2009

Как MySQL хранит поле varchar? Могу ли я предположить, что следующий шаблон представляет разумные размеры хранилища:

1,2,4,8,16,32,64,128,255 (макс.)

Разъяснение на примере. Допустим, у меня есть поле varchar из 20 символов. MySQL при создании этого поля в основном резервирует пространство для 32 байтов (не уверен, являются ли они байтами или нет), но допускает ввод только 20?

Полагаю, меня беспокоит оптимизация дискового пространства для массивной таблицы.

Ответы [ 2 ]

54 голосов
/ 20 июля 2009

Чтобы ответить на вопрос, на диске MySql использует 1 + размер, который используется в поле для хранения данных (поэтому, если столбец был объявлен как varchar (45), а поле было «FooBar», он будет использовать 7 байтов). на диске, если, конечно, вы не используете многобайтовый набор символов, где он будет использовать 14 байтов). Таким образом, как бы вы ни объявили свои столбцы, это не будет иметь никакого значения для хранилища (вы заявили, что беспокоитесь об оптимизации диска для массивной таблицы). Тем не менее, это имеет значение в запросах, поскольку VARCHAR преобразуются в CHAR, когда MySql создает временную таблицу (SORT, ORDER и т. Д.), И чем больше записей вы можете разместить на одной странице, тем меньше памяти и быстрее будет сканироваться таблица. быть.

24 голосов
/ 20 июля 2009

MySQL сохраняет поле varchar в виде записи переменной длины с однобайтовым или двухбайтовым префиксом для указания размера записи.

Наличие структуры размеров хранилища на самом деле не имеет никакого значения для функционирования MySQL при работе с хранилищами записей переменной длины. Длина, указанная в объявлении varchar (x), просто определяет максимальную длину данных, которые могут быть сохранены. По сути, varchar (16) не отличается от диска по сравнению с varchar (128).

Эта страница руководства содержит более подробное объяснение.

Изменить: Что касается вашего обновленного вопроса, ответ остается прежним. Поле varchar будет занимать столько же места на диске, сколько хранящихся на нем данных (плюс один или два байта). Так что не имеет значения, если у вас есть varchar (16) или varchar (128), если вы храните в нем 10-символьную строку, вы собираетесь использовать только 10 байт (плюс 1 или 2) дискового пространства .

...