Mysql – значение Data_free в таблице нельзя уменьшить
У нас есть большая производственная таблица MySQL5.7. Пытаемся уменьшить значение Data_free.
Обычно мы просто запускаем команду «Оптимизировать» для различных таблиц базы данных, чтобы уменьшить ее до размера 7 МГ. Однако с одной таблицей нам этого добиться не удалось (мы используем innodb_file_per_table).
Есть ли способ заставить систему уменьшить значение до нормального размера?
1 ответ
Вы используете ENGINE=InnoDB? Является ли рассматриваемая таблица секционированной?
MySQL InnoDB предварительно выделяет «экстенты» в ожидании вставки новых строк. Обычно (не всегда) это отображается как Data_free, равный ровно 4 МБ, 5 МБ, 6 МБ или 7 МБ. Вы не можете избавиться от этого.
Вы заметили, чтоOPTIMIZE TABLE
редко сильно сжимает какую-либо таблицу? Вы заметили, что операция блокирует другие действия на столе? В общем, эта команда бесполезна для таблиц InnoDB.
Data_free — единственный видимый показатель «фрагментации» и другого «свободного» пространства. Не беспокойтесь об этом.
АPARTITIONed
«Таблица» состоит из нескольких «таблиц», по одной на каждый раздел. Каждая подтаблица может иметь некоторый Data_free. Следовательно, вся секционированная таблица может иметь гораздо больший Data_free. Опять же, этот Data_free нельзя сжать (за исключением редких случаев).