
У меня есть таблица 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