![Требования к хранилищу для столбца MySQL TEXT](https://rvso.com/image/1366212/%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D1%83%20%D0%B4%D0%BB%D1%8F%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0%20MySQL%20TEXT.png)
У меня есть таблица 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