MySQL различное обращение между VarChar (255) и VarChar (65536) - PullRequest
12 голосов
/ 05 мая 2011

Кто-нибудь знает разницу между использованием VarChar (255) и VarChar (65536)?

Вот что я знаю до сих пор:

  • VarChar (255) будет использовать только один байт для размера
  • VarChar (65536) будет использовать два байта для размера
  • VarChar (65536) существует только с MySQL 5.0.3
  • MySQL использует другую обработку между 255 и 65536 (хотя не знаю разницу)

В чем я не уверен, есть ли разница в производительности между этими varchars.

Допустим, я хотел бы создать таблицу с несколькими типами строк. Использование перечисления с 'data_type1' и 'data_type2'

data_type1 никогда не будет иметь более 255 символов в varchar data_type2 в основном будет иметь более 255 символов в varchar

Какая таблица решений будет лучше?

id (int) - autoincrement
type (enum : data_type1, data_type2)
msg (varchar(255))
data (TEXT)

Использование только столбца «data», когда type == data_type2?

или

id (int) - autoincrement
type (enum : data_type1, data_type2)
msg (varchar(65536))

Используя столбец "msg", какой бы тип не присутствовал?

В обоих случаях для целей лечения требуется столбец типа.

РЕДАКТИРОВАТЬ:

Когда type == data_type2, сохраненные данные никогда не будут превышать 10000 символов

РЕДАКТИРОВАТЬ 2:

Я не ищу поиск в столбцах сообщений и данных

Это простой вопрос о производительности хранилища, а не об индексах или производительности поиска ...

Ответы [ 2 ]

25 голосов
/ 05 мая 2011

Вы упомянули некоторые вещи, которые являются правдой, я объясню, как работает VARCHAR.

Если указать VARCHAR (60), это означает, что он может содержать до 60 символов. Если он содержит меньше символов, скажем, 50 - тогда MySQL использует 50 байтов для хранения данных вместо 60.

С CHAR (60) все обстоит иначе - он резервирует 60 байтов независимо от длины строки, которую вы хотите сохранить.

Теперь, как работает VARCHAR? Если вы укажете его как VARCHAR (255), это означает, что столбец зарезервирует 1 байт + длину байтов строки. Этот 1 байт указывает на длину строки. 1 байт = вы можете хранить от 0 до 255 значений (от 2 до степени 8 = 256).

Что касается VARCHAR, значение которого превышает 255, вам необходимо каким-то образом хранить количество используемых байтов. Поскольку 1 байт может хранить только до 256 различных значений (0 - 255), вам необходимо использовать два байта. Два к степени 16 = 65536, что означает, что вы можете хранить любую строку до этого размера, а затем она складывает 2 байта, чтобы указать, какова длина строки.

Таким образом, чтобы сократить это - разница в производительности заключается в том, что если у вас есть VARCHAR (65536) и вы используете 200 байтов для хранения текста - вы тратите впустую тот 1 дополнительный байт, который будет использовать VARCHAR (65536). Кто-то может подумать: «О, но это всего лишь 1 байт, кого это волнует». На самом деле многие люди - представьте, что у вас есть несколько столбцов VARCHAR на таблице, в которой 50 миллионов записей. Допустим, у вас есть 3 столбца varchar, каждый из которых расходует дополнительный байт - это 3 байта * 50 миллионов ~ 144 мегабайта потерянного пространства. Самое смешное, что это не просто пустое пространство. Это также способствует дополнительной обработке и использованию дополнительной оперативной памяти, когда вы хотите что-то прочитать. И кто сказал, что в вашей БД будет только 1 таблица, которая станет большой?

Знание этой информации может помочь вам решить, что лучше всего использовать.

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html Если вы не проверяли это раньше, это объясняет, как хранится каждый тип данных и сколько места ему требуется.

0 голосов
/ 05 мая 2011

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

...