VARCHAR(x) — установка длины превращает ее в фиксированную длину с точки зрения производительности MySQL?

Я понимаю разницу между CHAR и VARCHAR, один из которых имеет фиксированную длину, а другой — переменную длину, и что, если все поля в строке имеют фиксированную длину, таблица обычно работает лучше.

Однако мне неясно, что если я задаю VARCHAR длину, такую ​​как VARCHAR(500), сохраняет ли это строку фиксированной длины?

Для контекста у меня есть чистая таблица с 50 столбцами, в основном TINYINT, но мне нужны два столбца в этой таблице как VARCHAR, так как в каждом из них нужно будет хранить до 500 символов. Точная длина зависит от пользовательского ввода и поэтому неизвестна.

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

Любая помощь будет оценена по достоинству. Спасибо.


person Tom    schedule 06.01.2010    source источник


Ответы (2)


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

mysql> create table t (a varchar(3));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values ('abc'), ('defgh');
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> select * from t;
+------+
| a    |
+------+
| abc  |
| def  |
+------+
2 rows in set (0.00 sec)
person Antoine P.    schedule 06.01.2010
comment
Также помните, что varchar на самом деле будет использовать больше памяти для записи, чем количество байтов в строке. Это делается для хранения длины строки, а также самой строки. Например. если вы используете varchar(5) и все записи имеют поле, заполненное 5 символами, то для каждой записи будет использоваться 6 байтов. char(5) будет использовать только 5 байтов для каждой записи. Это может иметь значение, когда у вас есть миллионы строк! Хотя в этом случае таблица поиска со ссылкой на целочисленный идентификатор может быть лучше для производительности, особенно если какие-либо данные в поле дублируются во многих строках. Надеюсь, это поможет. - person Dave Rix; 07.01.2010

Нет, он просто устанавливает максимальный размер.

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

person code_burgar    schedule 06.01.2010