2016-04-06 3 views
0

Насколько я понимаю, единственное различие между различными типами TEXT столбцов в MySQL является количество байтов, необходимых для хранения длины:Почему существуют разные типы ТЕКСТОВ?

TINYTEXT L + 1 bytes, where L < 2^8 
TEXT  L + 2 bytes, where L < 2^16 
MEDIUMTEXT L + 3 bytes, where L < 2^24 
LONGTEXT L + 4 bytes, where L < 2^32 

Так почему же не существует только один тип столбца с максимальным длина и отсутствие необходимости хранить длину?

TEXT  L bytes, where L < 2^32 
+0

Посмотрите на это [сообщение] (http://stackoverflow.com/questions/7755629/varchar255-vs-tinytext-tinyblob-and-varchar65535-vs-blob-text) – 1000111

+0

@ 1000111 Я понимаю различия. Я хочу знать * почему *. –

ответ

1

Для этого есть исторические причины. MySQL был разработан 20 лет назад, используя идеи и аппаратные и программные ограничения того времени. 32-битное оборудование и Linux были чем-то относительно новым в 1995 году. Обычный объем оперативной памяти, установленный на настольном компьютере, составлял где-то около 4-8 МБ. Серверы имели 16 или 32 МБ.

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

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

Существует несколько причин, по которым были созданы строковые строки с фиксированной длиной и переменной длиной. Хотя переменная длина кажется лучше, потому что она не пустая, данные строковых столбцов фиксированной длины могут храниться в том же месте, что и данные других типов данных фиксированной длины (целые числа, даты и т. Д.). Наличие одинаковой длины для всех записей таблицы очень важно на низком уровне, потому что она обеспечивает постоянное время для поиска и извлечения строки в хранилище, учитывая номер строки (предоставляемый индексом). Строки переменной длины не могут обеспечить эту функциональность, поэтому они были сохранены в другом месте, используя другой способ их извлечения. Другое место означает, что дополнительный диск считывается, чтобы получить их в память, и это требует времени. Как строковые, так и переменные длины имеют преимущества и недостатки.

Что касается размеров, еще в 80-е годы (и до этого) в RDBMSes, используемые для реализации только CHAR/VARCHAR (макс. 255 байт) и TEXT. Для большинства систем баз данных в то время максимальная длина поля TEXT не превышала 64 КБ.

MySQL реализовал типы данных, используемые существующими системами баз данных в 1995 году и расширил их.

Благодаря аппаратным улучшениям и сокращению стоимости хранения в ГБ в течение последних 20-25 лет, технические причины, породившее существование CHAR и VARCHAR строковых типов и их различные ароматы размера стали меньше и менее важными. Как следствие, MySQL объединил свою внутреннюю обработку и хранение, как вы отметили в своей документации.

+0

Спасибо. Я думаю, что разные типы должны поддерживаться для обратной совместимости. –

0

По той же причине существуют различные размеры число (TINYINT, SMALLINT и т.д.): чем больше каждая запись тем больше места занимает, которые потребляют места на жестком диске, делает поисковые запросы медленнее, и т.д., и когда число, когда количество отчетов масштабируется, также вызывает проблемы. Как правило, разумно всегда использовать наименьший возможный тип.

+0

Это неправильно. Как указано в руководстве, размер содержимого не имеет значения для различий в размере хранилища, и разница в размере хранилища исчезнет, ​​если там только один тип (для хранения размера не требуется дополнительных байтов). –

+0

Если причиной того, что mysql отслеживать размер файла, является тот факт, что для TEXT существуют разные типы данных, это было бы глупо. Вам не кажется? Поскольку каждая таблица имеет только один тип для каждого столбца. Принимая 4 типа, вы можете использовать тот, который дает вам меньшие накладные расходы. – Zalomon

+0

. Мое предположение, потому что они отслеживают размер файла (и, как я думаю, это то, что вы действительно хотите знать), заключается в том, что им нужно знать, где читать для извлечения. Упростите многое: представьте себе огромный массив, в котором вы указали на начало каждой разной строки и используете длину, чтобы знать, где остановиться. – Zalomon

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