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

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .