MySQL отличается от VarChar (255) и VarChar (65536)

Кто-нибудь знает разницу между использованием 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:

Я не ищу поиск в столбцах msg и data​​strong >

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

Ответ 1

Вы упомянули некоторые вещи, которые верны, я объясню, как работает 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 байтов для хранения текста, вы теряете лишний байт, который будет использовать VARCHAR (65536). Можно подумать "о, но это всего лишь 1 байт, который заботится об этом". На самом деле много людей - представьте себе, что на столе собрано несколько столбцов VARCHAR, которые получили 50 миллионов записей. Скажем, у вас есть 3 столбца varchar, каждый из которых содержит дополнительный байт - 3 байта * 50 миллионов ~ 144 мегабайта впустую. Самое смешное, что это не просто потерянное пространство. Это также способствует обработке накладных расходов и использованию дополнительной ОЗУ, когда вы хотите что-то прочитать. И кто скажет, что в вашей БД будет всего одна таблица, которая будет большой?

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

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

Ответ 2

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