Имеет ли значение ограничение размера VARCHAR? [дубликат]


Возможный Дубликат:
Важность длины переменной в таблице MySQL

При использовании VARCHAR (при условии, что это правильный тип данных для короткой строки) имеет ли значение размер? Если я установлю его равным 20 символам, это займет меньше места или будет быстрее, чем 255 символов?

Author: Community, 2010-12-01

8 answers

В общем случае для поля VARCHAR объем данных, хранящихся в каждом поле, определяет его размер на диске, а не максимальный размер (в отличие от поля CHAR, которое всегда имеет одинаковый размер).

Существует верхний предел для общего количества данных, хранящихся во всех полях индекса, равный 900 байтам ( Ограничение на размер индекса в 900 байт по длине символов).

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

 11
Author: symcbean, 2017-05-23 12:34:24

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

Префиксы могут иметь длину до 1000 байт (767 байт для таблиц InnoDB). Обратите внимание, что пределы префикса измеряются в байтах, тогда как длина префикса в операторах CREATE TABLE интерпретируется как количество символов. Обязательно учитывайте это при указании длины префикса для столбца, в котором используется многобайтовый набор символов.

Источник : http://dev.mysql.com/doc/refman/5.0/en/column-indexes.html

В параметрах сортировки latin1 можно указать только до 3 столбцов varchar(255).
В то время как можно указать до 50 столбцов для varchar(20)

Напрямую, без надлежащего индекса, это будет замедлять скорость запроса

С точки зрения хранения, это не имеет значения,
поскольку varchar означает variable-length strings

 9
Author: ajreal, 2010-12-01 13:44:25

Фактические различия заключаются в следующем:

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

  • TINYTEXT и другие "похожие на большие двоичные объекты" поля заставят SQL layer (MySQL) использовать временные таблицы на диске всякий раз, когда они используются, тогда как VARCHAR все равно будет отсортирован "в памяти" (хотя и будет преобразован в СИМВОЛ на всю ширину).

  • InnoDB внутренне на самом деле не волнует, является ли это tinytext или varchar. Это очень легко проверить, создать две таблицы, одну с VARCHAR(255), другую с TINYINT, и вставить запись в обе. Они оба будут занимать одну страницу 16 кб, в то время как при использовании переполненных страниц таблица TINYTEXT должна отображаться как занимающая не менее 32 кб в состоянии "ПОКАЗАТЬ ТАБЛИЦУ'.

Обычно я предпочитаю VARCHAR(255) - они не вызывают слишком большой фрагментации кучи для одна строка, и ее можно рассматривать как один объект 64k в памяти внутри MySQL. На InnoDB различия в размерах незначительны.

 5
Author: Pentium10, 2010-12-01 13:41:09

В документации MySQL: http://dev.mysql.com/doc/refman/5.0/en/char.html

У вас есть таблица, в которой указаны байты переменной (4) (по сравнению с символом(4)).

Простой VARCHAR(4) без строки, всего 1 байт. Тогда простой VARCHAR(255) без строки равен 1 байту. Переменная (4) с "ab" составляет 3 байта, а ПЕРЕМЕННАЯ (255) с "ab" - 3 байта. Это то же самое, но с ограничением по длине:)

 4
Author: Eleazan, 2010-12-01 13:44:28

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

 2
Author: Spencer Ruport, 2010-12-01 13:40:00

Этот ответ должен вам помочь.

 1
Author: Vladimir Ivanov, 2017-05-23 12:09:59

Если вы установите для него значение 20, он сохранит только первые 20 символов. Так что да, он займет меньше места, чем 255 символов:).

 0
Author: Yeroon, 2010-12-01 13:39:07

Необходимое место для хранения VARCHAR выглядит следующим образом:

VARCHAR(L), VARBINARY(L) - L + 1 байт, если значения столбцов требуют от 0 до 255 байт, L + 2 байта, если значения могут потребовать более 255 байт

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

 0
Author: Gumbo, 2010-12-01 13:41:24