MySQL: большой VARCHAR против текста?

720

У меня есть таблица сообщений в MySQL, которая записывает сообщения между пользователями. Помимо типичных идентификаторов и типов сообщений (все целые типы), мне нужно сохранить фактический текст сообщения как VARCHAR или TEXT. Я устанавливаю front-end limit из 3000 символов, что означает, что сообщения никогда не будут вставляться в db дольше, чем это.

Есть ли обоснование для перехода с VARCHAR (3000) или TEXT? Там что-то о том, как просто писать VARCHAR (3000), который чувствует себя несколько контр-интуитивным. Я прошел через другие подобные сообщения в Stack Overflow, но было бы неплохо получить представление, специфичное для этого типа общего хранения сообщений.

  • 25
    Немного стар, но я пришел сюда, потому что столкнулся с проблемой, которая заставила меня задуматься над этим. В моем случае моя форма интерфейса была ограничена 2000 символами, но кодировка, неявная в моем методе хранения, кодировала международные символы в виде нескольких символов (что, очевидно, может составлять от 3 до 12 на символ). Так что мои 2000 внезапно становятся до 24000. Что-то думать о...
  • 3
    Я обнаружил, что текст для многих одновременных вставок значительно быстрее.
Показать ещё 6 комментариев
Теги:
text
messages
varchar

4 ответа

760
Лучший ответ

TEXT и BLOB хранятся за столом, при этом таблица имеет указатель на расположение фактического хранилища.

VARCHAR хранится в строке с таблицей. VARCHAR быстрее, когда размер разумный, компромисс которого будет быстрее зависит от ваших данных и вашего оборудования, вы бы хотели сравнить сценарий реального мира с вашими данными.

  • 143
    +1: VARCHAR (хранится в строке) обычно быстрее, если данные часто извлекаются (включается в большинство запросов). Однако для большого объема данных, которые обычно не извлекаются (то есть не ссылаются ни на один запрос), может быть, лучше не хранить данные в строке. Существует верхний предел размера строки для данных, хранящихся в строке.
  • 18
    Можете ли вы включить любой источник? Где ты это прочитал? Благодарю.
Показать ещё 17 комментариев
349

Можете ли вы предсказать, как долго будет вводиться пользователь?

УАКСНАК (Х)

Дело: имя пользователя, адрес электронной почты, страна, тема, пароль


ТЕКСТ

Дело: сообщения, электронные письма, комментарии, форматированный текст, html, код, изображения, ссылки


MEDIUMTEXT

Дело: большие тела json, книги с малой длиной до средней длины, строки csv


LONGTEXT

Дело: учебники, программы, летние файлы журналов, Гарри Поттер и кубок огня, ведение научных исследований

  • 7
    Предсказуемость действительно побочный элемент здесь. Фактически максимальная ожидаемая длина должна быть решающим фактором. Элементы, которые вы упоминаете как более предсказуемые, только так, потому что они короче, чем другие.
  • 26
    @ Andrew-Barber Это моя точка зрения, хотя. Все остальные посты хорошо объясняют различия, но не ситуации, когда вам приходится выбирать между ними. Я пытался указать, что использование varchar для предсказуемо короткого - это хороший выбор, а использование текста для произвольно длинного - хороший выбор.
Показать ещё 7 комментариев
217

Просто для уточнения наилучшей практики:

  • Сообщения в текстовом формате почти всегда сохраняются как ТЕКСТ (они заканчиваются сколь угодно длинными)

  • Атрибуты String должны храниться как VARCHAR (имя пользователя-получателя, субъект и т.д.).

Я понимаю, что у вас есть предел переднего конца, и это здорово, пока это не так. * grin * Трюк состоит в том, чтобы думать о БД отдельно от приложений, которые подключаются к нему. Просто потому, что одно приложение ограничивает данные, это не означает, что данные ограничены по существу.

Что происходит с сообщениями, которые заставляют их не больше 3000 символов? Если это просто произвольное ограничение приложения (скажем, для текстового поля или что-то еще), используйте поле TEXT на уровне данных.

  • 0
    Что значит «что хорошо, пока это не так»? Что означает «не»?
  • 6
    @Pacerier Чтобы привести пример «не», о котором Джеймс, скорее всего, говорит о: например, Twitter, который до недавнего времени имел ограничение в 140 символов для PM. Они решили, что это больше не имеет смысла, и решили полностью устранить этот предел. Если бы они не думали об этом заранее (что я вполне уверен, что они, вероятно, сделали ...), они бы столкнулись со сценарием, изложенным выше.
Показать ещё 3 комментария
29

Отказ от ответственности: я не эксперт по MySQL... но это мое понимание проблем.

Я думаю, что TEXT хранится вне строки mysql, в то время как я думаю, что VARCHAR хранится как часть строки. Для строк mysql существует максимальная длина строки, поэтому вы можете ограничить количество других данных, которые вы можете сохранить в строке, используя VARCHAR.

Также из-за того, что VARCHAR является частью строки, я подозреваю, что запросы, смотрящие на это поле, будут немного быстрее, чем при использовании фрагмента TEXT.

  • 37
    Ограничение длины строки составляет 65 535 байт [ dev.mysql.com/doc/refman/5.0/en/column-count-limit.html ]. Если ваш столбец имеет кодировку utf8, это означает, что столбец varchar из 3000 символов может занимать до 9000 байт.
  • 7
    Символы UTF-8 могут иметь длину до 4 байт, поэтому я думаю, что вы имели в виду 12 000 байт (если только в MySQL нет какой-то вещи, которую я не понимаю).
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню