Каковы оптимальные размеры varchar для MySQL?

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

1,2,4,8,16,32,64,128,255 (max)

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

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

Ответ 1

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

Ответ 2

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

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

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

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