TEXT против VARCHAR в InnoDB MySQL 5.5. Когда использовать каждый

Каковы основные различия между текстом и varchar в механизме хранения InnoDB в MySQL 5.5?

Используется ли text или varchar(5000), если речь идет о переменном текстовом поле не более 5000 символов?


person Emilio Nicolás    schedule 08.07.2011    source источник
comment
Возможный дубликат MySQL: большой VARCHAR против TEXT?   -  person Evan Carroll    schedule 22.06.2018


Ответы (3)


Согласно сообщению на форуме в innodb.com

С точки зрения InnoDB varchar, текст и большой двоичный объект размещаются на диске точно так же. Если вас интересуют внутренние детали, есть разница в том, как InnoDB передает значения varchar и text обратно в MySQL. В случае varchar значение передается обратно в буфер строк, тогда как в случае текста буфер строк содержит указатель на фрагмент памяти, содержащий фактическое значение. Но опять же, это больше похоже на деталь интерфейса механизма хранения MySQL и не должно иметь отношения к конечному пользователю.

Также проверьте это .

person Balanivash    schedule 08.07.2011
comment
Кроме того, согласно этому, InnoDB хранит до 7 КБ text/blob/varchar вместе с другими обычными полями на жестком диске, поэтому чтение более короткого текстового поля не требует чтения каких-либо внешних страниц, несмотря на распространенное мнение. - person ddekany; 07.12.2011
comment
Ссылка сейчас не работает - person cmoran92; 03.05.2017

Вообще говоря, использование TEXT заключалось в "присоединении" редко используемых больших данных к строке с минимальным влиянием на производительность, когда к ним нет доступа, например. вы не хотели бы искать/индексировать содержимое. Кроме того, это был единственный вариант, превышающий старый максимум 255 байт для VARCHAR.

Однако InnoDB размыла когда-то четкую грань между VARCHAR и TEXT. Я могу найти три основных отличия:

  1. Еще одно различие в производительности заключается в том, что поля TEXT принудительно записывают временные таблицы на диск во время операторов SELECT. Это может привести к снижению производительности для небольших данных, но см. этот пост о том, как использование действительно больших VARCHAR в этом сценарии может быть хуже из-за их преобразования в фиксированный размер в хранилище MEMORY. т.е. большие VARCCHAR заполнят буферы памяти и могут по-прежнему записываться на диск.

  2. Столбцы BLOB и TEXT не могут иметь значений по умолчанию. ссылка

  3. Индексируются только первые N символов полей TEXT. ссылка

Поэтому, несмотря на то, что теперь они хранятся в одной и той же структуре, всегда стоит протестировать все ваше приложение, чтобы увидеть, какие другие связанные различия могут повлиять на производительность, сортировку, поиск, размер хранилища, размер пакета, резервное копирование/репликацию и т. д.

person scipilot    schedule 17.05.2014
comment
Но см. этот пост, чтобы узнать, как использование действительно больших VARCHAR в этой ссылке сценария относится к эссе, анализирующему только MyISAM, а не применимому к InnoDB. - person jrochkind; 19.10.2014
comment
Статья в основном посвящена MyISAM, но поведение, на которое я ссылаюсь, связано с использованием механизма хранения MEMORY для таблиц в памяти (временных). Я бы предположил, что не имеет значения, какой механизм хранения вы используете для основной базы данных. Однако я изучу это и внесу поправки в ответ с любыми разъяснениями. - person scipilot; 21.10.2014
comment
Да, я не уверен, это сбивает с толку, но статья, на которую вы ссылаетесь, начинается и заканчивается словами: И снова InnoDB имеет разные характеристики производительности. Я не проводил никаких тестов на InnoDB. - person jrochkind; 22.10.2014
comment
Я провел некоторое исследование и не могу найти доказательств того, что существует альтернативный механизм хранения для временных таблиц в памяти, отличный от MEMORY. Поэтому все базы данных будут иметь такое поведение, независимо от механизма хранения на диске. Опять же, тестирование было бы единственным способом убедиться. - person scipilot; 23.10.2014

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

подробнее varchar vs text — MySQL

person Sourav    schedule 08.07.2011
comment
Спасибо! Но я думаю, что говорить об увеличении производительности при использовании VARCHAR немного рискованно. Это зависит от многих других факторов. - person Emilio Nicolás; 08.07.2011
comment
согласно документам (dev.mysql.com/doc/refman /5.5/en/innodb-restrictions.html), если вся строка умещается в 8000 байт, все хранится локально. ЕСЛИ он больше, столбцы переменной длины перемещаются в другое место, включая TEXT и VARCHAR. - person carillonator; 03.07.2013