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

StackOverflow https://stackoverflow.com/questions/1151667

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top