Для таблицы innodb в MySQL, которая быстрее:varchar(255) или tinytext?

StackOverflow https://stackoverflow.com/questions/1068825

Вопрос

Я оптимизирую некоторые таблицы innodb в MySQL, поэтому я запустил процедура analsye() чтобы посмотреть, каковы были рекомендации.

Рекомендуемые результаты tinytext вместо varchar(255) для всех полей, которые ранее были настроены как varchar(255)

Есть ли какой-нибудь прирост производительности быть полученным с помощью крошечный текст?Меня здесь волнует только скорость, а не размер.

Это было полезно?

Решение

Не верьте, если кто-нибудь скажет вам, что TINYTEXT хранится другим способом, чем VARCHAR.

Фактические различия заключаются в следующем:

  • TINYTEXT и другие текстовые поля хранятся отдельно от строки в памяти внутри кучи MySQL, тогда как поля VARCHAR() увеличивают лимит до 64 КБ (так что у вас может быть больше 64 КБ в TINYTEXTs, тогда как с VARCHAR этого не произойдет).

  • TINYTEXT и другие поля, похожие на большие двоичные объекты, заставят уровень SQL (MySQL) использовать временные таблицы на диске всякий раз, когда они используются, тогда как VARCHAR все равно будет отсортирован "в памяти" (хотя и будет преобразован в CHAR на всю ширину).

  • InnoDB внутренне на самом деле не имеет значения, является ли это tinytext или varchar.Это очень легко проверить, создайте две таблицы, одну с VARCHAR(255), другую с TINYINT, и вставьте запись в обе.Они оба будут занимать одну страницу размером 16 кб, тогда как, если используются страницы с переполнением, таблица TINYTEXT должна отображаться как занимающая не менее 32 КБ в "SHOW TABLE STATUS".

Обычно я предпочитаю VARCHAR(255) - они не вызывают слишком большой фрагментации кучи для одной строки и могут обрабатываться как один 64-килобайтный объект в памяти внутри MySQL.В InnoDB различия в размерах незначительны.

Другие советы

Я бы ожидал, что varchar будет быстрее, чем tinytext, и, судя по моему гуглению, это общее мнение.Конечно, вам пришлось бы протестировать свою систему, чтобы быть по-настоящему уверенным.

Причина, по которой это быстрее, заключается в том, что когда MySQL выполняет определенные виды операций (объединения, сортировку и т.д.), Он часто создает временные таблицы.Когда у вас есть тип BLOB-объекта (например, tinytext) во временной таблице, таблица будет основана на диске, а не на памяти, что, конечно, повлияет на производительность.

CHAR / VARCHAR будет работать быстрее, поскольку эти столбцы хранятся на той же странице, что и данные основной строки *, тогда как текстовые типы хранятся за пределами страницы (Я был неправ, см. Комментарий Харрисона).

Раньше люди часто использовали tinytext, потому что varchar (раздражающе) обрезал завершающие пробелы.Это поведение было удалено в MySQL 5.0.

(* По крайней мере, для первых 768 байт, и со встроенным InnoDB, а не с новым плагином InnoDB).

Возможно, вы также захотите рассмотреть возможность использования char(255) - хотя это и занимает больше места, было значительно быстрее (по моему опыту) использовать поле постоянного размера при последующих сравнениях.Дополнительное пространство может быть заполнено дополнением, если вы ищете просто скорость, а затем игнорируйте пробелы позже.

Однако обратите внимание:MySQL не позволит varchar и char типы, которые должны существовать в одной таблице.Он также [обычно] не допускает сравнений между varchar и char.Я обнаружил это в прошлом году, когда делал реализацию таблицы для своего хобби проект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top