Требования к хранилищу для столбца MySQL TEXT

Требования к хранилищу для столбца MySQL TEXT

У меня есть таблица MySQL, вызываемая errormsg2с помощью механизма хранения MyISAM, с примерно десятком столбцов.

Два из этих столбцов, по моим оценкам, занимают большую часть пространства, используемого для каждой строки, и они имеют тип данных TEXT. Это backtraceи msg.

Я пытаюсь оценить объем памяти, необходимый для каждой строки, и наталкиваюсь на следующее противоречие:

show table status where name = 'errormsg2';показывает, что (data_length + index_length) / rowsна строку приходится около 778 байт.

select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;показывает в среднем 899 байт текста на строку только из этих двух столбцов.

Как это возможно, что таблица хранит больше данных, чем использует? Что я упускаю?

решение1

Следует рассмотреть вопросы кодировки. Например, UTF-8 использует 5 байт для некоторых символов. Если у вас нет данных или переменные данные, база данных вынуждена предполагать худшее: что каждый символ может иметь длину 5 байт. Таким образом, она может выделить больше, чем ей фактически нужно использовать.

Обратите внимание, что UTF-16, хотя и предположительно состоит всего из 2 байтов, также может стать жертвой тех же проблем: ему приходится кодировать суррогатные пары длиной 4 байта. UTF-16 имеет множество других проблем, инекоторыйрекомендую всегда использовать UTF-8

Связанный контент