2012-06-21 3 views
5

Я видел комментарий «Если у вас есть 50 миллионов значений между 10 и 15 символами в столбце varchar (20) и те же 50 миллионов значений в столбце varchar (50), они будут занимать ровно одно и то же пространство. целая точка варчара, в отличие от символа ». Может ли кто-нибудь сказать мне причину? См. What is a reasonable length limit on person "Name" fields?varchar (20) и varchar (50) одинаковы?

+1

Он налагает логический * предел * (например, правило BO или «безопасность»). Пожалуйста, ищите SO - он появился раньше и вообще заканчивается в дискуссиях о пламенем. –

+0

@rabudde: вы уверены в этом? Можете ли вы дать ссылку? Я был бы очень удивлен, если бы определенная длина была помещена в индекс vor столбца varchar (теперь 'char' - это другое дело). Никакие СУБД, которые, как я знаю, не хранят полную длину в индексе, - но тогда MySQL всегда хорош для сюрпризов. –

+1

@pst, a_horse_with_no_name: вы правы, я был смущен другим фактом (UTF8 и индексы), и это точно так же, слишком большая длина «varchar» может привести к плохой производительности при сортировке или работе в временных таблицах (ссылка на высокопроизводительный MySQL от O'Reilly) – rabudde

ответ

5

MySQL предлагает выбор двигателей хранения. Физическое хранение данных зависит от механизма хранения.

MyISAM Хранение VARCHAR

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

(На самом деле, MyISAM дает a degree of choice между фиксированным физическим размером строк и переменными физических размерами рядов форматами таблиц в зависимости от типов столбцов, происходящих во всей таблице. Появление VARCHAR изменяет метод по умолчанию только, но наличие TEXT сгустка силыVARCHAR с в той же таблице, чтобы использовать метод переменной длины, а также.)

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

InnoDB Хранение VARCHAR

InnoDB, как и большинство других текущих реляционных баз данных, использует более сложный механизм. VARCHAR столбцы, максимальная ширина которых составляет менее 768 байт, будут сохранены в строке, с зарезервированной комнатой, соответствующей максимальной ширине. Более точно here:

Для каждого ненулевого поле переменной длины, заголовок записи содержит длина колонки в одном или двух байтов. Два байта будут только , если часть столбца хранится извне в переполненных страницах или Максимальная длина превышает 255 байт, а фактическая длина превышает 127 байт. Для столбца, хранящегося извне, длина двухбайтов указывает длину внутренней хранимой части плюс 20-байтовый указатель на часть, хранящуюся извне. Внутренняя часть составляет 768 байт, поэтому длина составляет 768 + 20. 20-байтовый указатель сохраняет истинную длину столбца .

В настоящее время InnoDB не выполняет сжатие пространства в своих индексах, противоположное MyISAM, как описано выше.

Вернуться к вопросу

Все вышесказанное, однако, лишь на реализацию деталь, которая может даже изменить между версиями. Истинная разница между CHAR и VARCHAR является семантической, а также между VARCHAR(20) и VARCHAR(50). Убедившись, что нет способа сохранить строку из 30 символов в VARCHAR(20), база данных упрощает и улучшает жизнь для различных процессоров и приложений, которые она предположительно интегрирует в предсказуемое поведение. Это большое дело.

Что касается личных имен, то this question может дать вам практическое руководство. В любом случае, люди с полными именами более 70 символов UTF-8.

3

Да, это действительно целая точка VARCHAR. Это занимает всего столько места, сколько текст длинный.

Если у вас есть CHAR (50), это займет до 50 байтов (или символов) независимо от того, насколько короткими данные на самом деле (он будет дополнен, как правило, пробелами).

Может ли кто-нибудь сказать мне причину?

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

+0

Это на самом деле немного сложнее, чем «бесполезная прокладка»: как сказать '' foo'' '' foo ''в CHAR (4)? –

+0

Правда. Вроде. Это может быть важно для некоторых людей.Я всегда получаю много downvotes, когда я это делаю (обычно в контексте решения Oracle обрабатывать пустые строки как NULL), но я сомневаюсь в дизайне приложения, который должен различать «foo» и «foo», (как вы можете видеть из этой темы комментариев, цитаты могут быть возможным решением здесь тоже, или вы можете использовать что-то другое, которое иначе не используется). – Thilo

+0

Чтобы поднять позитив относительно CHAR: он позволяет записывать фиксированную длину. Может быть важным для некоторых приложений специального назначения. – Thilo

2

The manual состояния:

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

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

Обратите внимание, что VARCHAR (255) является не такой же, как VARCHAR (256).

Это теория. Как предполагает habeebperwad, фактический размер одной строки зависит от размера страницы (двигателя) и размера жесткого диска.

Смежные вопросы