У меня есть таблица сообщений в MySQL, которая записывает сообщения между пользователями. Помимо типичных идентификаторов и типов сообщений (все целочисленные типы) мне нужно сохранить фактический текст сообщения как VARCHAR или TEXT. Я устанавливаю входной предел в 3000 символов, что означает, что сообщения никогда не будут вставляться в БД, как это дольше.
Есть ли смысл использовать VARCHAR (3000) или TEXT? В написании VARCHAR (3000) есть что-то нелогичное. Я просматривал другие подобные сообщения о переполнении стека, но было бы неплохо получить представления, относящиеся к этому типу общего хранения сообщений.
Ответы:
TEXT
иBLOB
может храниться вне таблицы с таблицей, имеющей только указатель на местоположение фактического хранилища. Где он хранится, зависит от многих вещей, таких как размер данных, размер столбцов, row_format и версия MySQL.VARCHAR
хранится в соответствии с таблицей.VARCHAR
быстрее, когда размер разумный, компромисс которого будет быстрее, зависит от ваших данных и вашего оборудования, вы захотите сравнить реальный сценарий с вашими данными.источник
varchar
иblob
/text
на InnoDB для небольших текстовых элементов? Так бы тогда разумно просто сделать всеvarchar
наtext
тип и пусть DB управлять встроенным переполнением против?Можете ли вы предсказать, как долго будет вводить пользователь?
источник
Просто чтобы уточнить лучшие практики:
Текстовые сообщения почти всегда должны храниться в формате TEXT (в конечном итоге они будут произвольно длинными)
Строковые атрибуты должны храниться как VARCHAR (имя пользователя, тема и т. Д.).
Я понимаю, что у вас есть лимит внешнего интерфейса, который хорош, пока его нет. * ухмылка * Хитрость заключается в том, чтобы рассматривать БД отдельно от приложений, которые к ней подключаются. То, что одно приложение накладывает ограничение на данные, не означает, что данные изначально ограничены.
Что в самих сообщениях заставляет их никогда не превышать 3000 символов? Если это просто произвольное ограничение приложения (скажем, для текстового поля или чего-то еще), используйте
TEXT
поле на уровне данных.источник
Отказ от ответственности: я не эксперт по MySQL ... но это мое понимание проблем.
Я думаю, что TEXT хранится вне строки mysql, а я думаю, что VARCHAR хранится как часть строки. Для строк mysql есть максимальная длина строки, поэтому вы можете ограничить объем других данных, которые можно хранить в строке, используя VARCHAR.
Также из-за того, что VARCHAR является частью строки, я подозреваю, что запросы, просматривающие это поле, будут немного быстрее, чем запросы, использующие блок TEXT.
источник
varchar
столбец из 3000 символов может занимать до 9000 байтов.TEXT
встроенный в таблице также.Краткий ответ: нет практического, производительности или хранения, разницы.
Длинный ответ:
По сути, нет никакой разницы (в MySQL) между
VARCHAR(3000)
(или любым другим большим пределом) иTEXT
. Первый будет усекать до 3000 символов ; последний будет урезан до 65535 байт . (Я делаю различие между байтами и символами, потому что символ может занимать несколько байтов.)Для меньших ограничений
VARCHAR
есть некоторые преимуществаTEXT
.CHARACTER SET
.INDEXes
ограничены в том, насколько большой столбец может быть проиндексирован. (767 или 3072 байта ; это зависит от версии и настроек)SELECTs
, обрабатываются двумя различными способами - MEMORY (быстрее) или MyISAM (медленнее). Когда задействованы «большие» столбцы, автоматически выбирается более медленная техника. (Значительные изменения ожидаются в версии 8.0; поэтому этот элемент марки может быть изменен.)TEXT
типы данных (в отличие отVARCHAR
) переходят прямо к MyISAM. То естьTINYTEXT
автоматически генерируется для сгенерированных временных таблиц хуже, чем эквивалентVARCHAR
. (Но это берет обсуждение в третьем направлении!)VARBINARY
это какVARCHAR
;BLOB
это какTEXT
.Опровержение других ответов
Исходный вопрос задал одну вещь (какой тип данных использовать); принятый ответ отвечал на что-то другое (внеплановое хранение). Этот ответ сейчас устарел.
Когда этот поток был запущен и получен ответ, в InnoDB было только два «формата строки». Вскоре после этого были введены еще два формата (
DYNAMIC
иCOMPRESSED
).Место хранения для
TEXT
иVARCHAR()
зависит от размера , а не от имени типа данных . Для обновленного обсуждения о включении / выключении хранения больших столбцов текста / больших двоичных объектов смотрите это .источник
Предыдущие ответы недостаточно настаивают на главной проблеме: даже в очень простых запросах, таких как
временная таблица может потребоваться, и если
VARCHAR
поле задействовано, оно преобразуется вCHAR
поле во временной таблице. Таким образом, если в вашей таблице указано 500 000 строк сVARCHAR(65000)
полем, только в этом столбце будет использоваться 6,5 * 5 * 10 ^ 9 байт. Такие временные таблицы не могут быть обработаны в памяти и записаны на диск. Можно ожидать, что воздействие будет катастрофическим.Источник (с метриками): https://nicj.net/mysql-text-vs-varchar-performance/ (Это относится к обработке
TEXT
vsVARCHAR
в «стандартном» (?) Механизме хранения MyISAM. Он может отличаться в других, например, InnoDB.)источник
Существует огромная разница между VARCHAR и TEXT. Хотя поля VARCHAR могут быть проиндексированы, поля TEXT - нет. Поля типа VARCHAR хранятся встроенными, а TEXT хранятся в автономном режиме, в записях фактически хранятся только указатели на данные TEXT.
Если вам нужно проиндексировать поле для более быстрого поиска, обновления или удаления, чем использовать VARCHAR, независимо от его размера. VARCHAR (10000000) никогда не будет таким же, как поле TEXT, потому что эти два типа данных различны по своей природе.
чем перейти к тексту.
источник
Varchar для небольших данных, таких как адреса электронной почты, в то время как Text для гораздо больших данных, таких как новостные статьи, Blob для двоичных данных, таких как изображения.
Производительность Varchar более высокая, поскольку он полностью запускается из памяти, но это не будет так, если данные слишком велики, как,
varchar(4000)
например ,.Текст, с другой стороны, не прилипает к памяти и зависит от производительности диска, но этого можно избежать, разделив текстовые данные в отдельной таблице и применив запрос левого соединения для извлечения текстовых данных.
BLOB-объект намного медленнее, поэтому используйте его только в том случае, если у вас нет таких данных, как 10000 изображений, которые будут стоить 10000 записей.
Следуйте этим советам для максимальной скорости и производительности:
Используйте varchar для имени, названий, электронных писем
Используйте текст для больших данных
Отдельный текст в разных таблицах
Используйте запросы левого соединения для идентификатора, такого как номер телефона
Если вы собираетесь использовать Blob, примените те же советы, что и в текстовом.
Это приведет к тому, что запросы будут стоить миллисекунды для таблиц с данными> 10 МБ и гарантированным размером до 10 ГБ.
источник