VARCHAR vs TEXT в MySQL
У меня есть два поля: один для хранения excerpt
с максимальным размером 500 символов, а другой для хранения description
с максимальным размером 10 000 символов.
Какие типы данных я должен использовать, TEXT
или VARCHAR
? И почему?
После MySQL 5.0.3 VARCHAR принимает ~ 65000 символов. Но это не говорит, почему я должен использовать один тип и т.д.
Я рассуждаю, что я должен использовать VARCHAR
для выдержки, потому что я могу назначить ограничение размера и TEXT
для поля description
, когда оно больше.
Ответы
Ответ 1
Длинный VARCHAR
хранится таким же образом, как поле TEXT
/BLOB
в InnoDB
(которое, как я полагаю, вы используете для транзакционной, ссылочной целостности и восстановления после сбоя, правильно?) - это находится снаружи от остальной части таблицы на диске (что может потребовать считывания другого диска).
Из памяти предполагаемого BLOB, TEXT as так как длинные VARCHAR обрабатываются такими же путь от Innodb. Вот почему Innodb руководство называет его "длинными столбцами" чем BLOB.
источник
Если вам не нужно индексировать эти столбцы (в этом случае VARCHAR
выполняется намного быстрее), нет смысла использовать VARCHAR
над TEXT
для длинных полей - в настройке MySQL
есть определенные оптимизаторы движка поиск данных по длине, и вы должны использовать правильный тип столбца, чтобы воспользоваться этими преимуществами.
Если вы используете MyISAM
, углубленное обсуждение темы здесь.
Ответ 2
Одно отличие между VARCHAR
и TEXT
заключается в том, что вы можете объявить предложение DEFAULT
для столбца VARCHAR
, но не для столбца TEXT
.
@Andy правильно, что InnoDB сохраняет как VARCHAR
, так и TEXT
так же внутренне.
FULLTEXT
индексы поддерживаются как VARCHAR
, так и TEXT
. До 5.6 вы должны использовать MyISAM для получения этого типа индекса. В MySQL 5.6 он, наконец, поддерживает FULLTEXT
в InnoDB. Хотя вы должны тщательно его протестировать, потому что это кажется возвращать разные результаты, чем реализация в MyISAM.
Однако Sphinx Search работает быстрее и богаче, чем реализация в MySQL. См. Мой обзор в Полнотекстовый поиск Throwdown.
@Mohammed спросил:
когда VARCHAR
рассматривается LONG VARCHAR
? Есть ли характерный порог?
Если вы объявляете длину до 255 байт, она может кодировать длину заданной строки с использованием одного байта. Если вы объявляете длину столбца max более 255 байт, для кодирования длины он будет использовать два байта.
Вы можете объявить столбец как LONG VARCHAR
, но это действительно просто псевдоним для MEDIUMTEXT.
mysql> create table test ( l long varchar);
mysql> show create table test\G
CREATE TABLE `test` (
`l` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Ответ 3
Если ваш контент соответствует столбцу varchar, используйте varchar.
Данные Varchar хранятся в каждой строке. Текстовые данные сохраняются как капли вне таблицы.
В соответствии с этот тест, varchar примерно в три раза быстрее, чем текст.