разделение связано с некоторой информацией, которая объясняет основную проблему (есть различия в производительности), но недостаточно просто сказать, что одно всегда лучше другого. (иначе, не было бы никакой причины иметь оба.) Кроме того, в MyISM максимальный размер 64 КБ для VARCHAR не для поля - это для каждой записи.
По сути, есть 4 способа хранения строк в записях базы данных:
- фиксированная длина
- Строки в стиле C (помеченные NULL или аналогичными символами в конце строки)
- Строки в стиле Pascal (несколько байтов для обозначения длины, затем строка)
- Указатели (храните строку где-то еще)
MyISM использует нечто похожее на # 3 для VARCHAR и гибридный подход для TEXT, где он сохраняет начало строки в записи, а затем остаток строки где-то еще. InnoDB аналогичен для VARCHAR, но сохраняет полное поле TEXT вне записи.
При использовании 1 и 4 материал в записи всегда имеет одинаковую длину, поэтому пропустить его проще, если вам не нужна строка, но вам нужно что-то после нее. И № 2, и № 3 не так уж плохи для коротких строк ... № 2 должен продолжать искать маркер, в то время как № 3 может пропустить вперед ... так как строки становятся длиннее, № 2 ухудшается для этого конкретного использования кейс.
Если вам действительно нужно прочитать строку, № 4 медленнее, поскольку вы должны прочитать запись, а затем прочитать строку, которая может храниться в другом месте на диске, в зависимости от того, как эта база данных обрабатывает ее. # 1 всегда довольно прост, и снова вы сталкиваетесь с похожими проблемами, где для # 2 тем хуже, чем длиннее строка, в то время как # 3 немного хуже, чем # 2 для очень маленьких строк, но лучше, когда становится длиннее.
Тогда есть требования к хранилищу ... # 1 всегда имеет фиксированную длину, поэтому он может иметь раздувание, если большинство строк не максимальной длины. # 2 имеет 1 дополнительный байт; # 3 обычно имеет 2 дополнительных байта, если максимальная длина = 255, 4 дополнительных байта, если максимум 64 КБ. # 4 имеет длину указателя, плюс правила для # 3 обычно.
Для определенных реализаций в MySQL 5.1 документы для состояния MyISM :
- Поддержка истинного типа VARCHAR; столбец VARCHAR начинается с длины, хранящейся в одном или двух байтах.
- Таблицы со столбцами VARCHAR могут иметь фиксированную или динамическую длину строки.
- Сумма длин столбцов VARCHAR и CHAR в таблице может составлять до 64 КБ.
В то время как для InnoDB :
- Часть переменной длины заголовка записи содержит битовый вектор для указания столбцов NULL. Если число столбцов в индексе, которое может быть NULL, равно N, битовый вектор занимает байты CEILING (N / 8). (Например, если есть от 9 до 15 столбцов, которые могут иметь значение NULL, битовый вектор использует два байта.) Столбцы с NULL не занимают места, отличного от бита в этом векторе. Часть заголовка переменной длины также содержит длины столбцов переменной длины. Каждая длина занимает один или два байта, в зависимости от максимальной длины столбца. Если все столбцы в индексе NOT NULL и имеют фиксированную длину, заголовок записи не имеет части переменной длины.
- Для каждого поля переменной длины, отличного от NULL, заголовок записи содержит длину столбца в один или два байта. Два байта понадобятся только в том случае, если часть столбца хранится снаружи на страницах переполнения или максимальная длина превышает 255 байтов, а фактическая длина превышает 127 байтов. Для внешне сохраненного столбца двухбайтовая длина указывает длину внутренне сохраненной части плюс 20-байтовый указатель на внешне сохраненную часть. Внутренняя часть составляет 768 байт, поэтому длина составляет 768 + 20. 20-байтовый указатель хранит истинную длину столбца.
...
как и во многих других вещах при работе с базами данных, если вы не уверены, что лучше для ваших нужд, попробуйте сравнить его с аналогичными данными и использованием, и посмотрите, как они себя ведут.