краткий ответ:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
Ответ "Вы должны знать"
Прежде всего вы должны понимать, что таблицы Mysql фрагментируются при обновлении строки, так что это нормальная ситуация. Когда таблица создана, скажем, импортирована с использованием дампа с данными, все строки сохраняются без фрагментации на многих страницах с фиксированным размером. Когда вы обновляете строку переменной длины, страница, содержащая эту строку, делится на две или более страниц для хранения изменений, и эти две новые (или более) страницы содержат пустые места, заполняющие неиспользуемое пространство.
Это не влияет на производительность, если, конечно, фрагментация не растет слишком сильно. Что слишком много фрагментации, давайте посмотрим на запрос, который вы ищете:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH и INDEX_LENGTH - это пространство, которое используют ваши данные и индексы, а DATA_FREE - это общее количество байтов, неиспользуемых на всех страницах таблицы (фрагментация).
Вот пример реальной производственной таблицы
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
В этом случае у нас есть Таблица, использующая (896 + 316) = 1212 МБ, и у нас есть свободное пространство 5 МБ. Это означает «коэффициент фрагментации»:
5/1212 = 0.0041
... Что является действительно низким "коэффициентом фрагментации".
Я работал с таблицами с коэффициентом около 0,2 (что означает 20% пробелов) и никогда не замечал замедления запросов, даже если я оптимизирую таблицу, производительность остается той же. Но применение таблицы оптимизации на столе размером 800 МБ занимает много времени и блокирует таблицу на несколько минут, что нецелесообразно для производства.
Итак, если вы считаете, что вы выиграли в производительности и потратили время на оптимизацию таблицы, я предпочитаю НЕ ОПТИМИЗИРОВАТЬ.
Если вы считаете, что для хранения лучше, посмотрите соотношение и посмотрите, сколько места вы сможете сэкономить при оптимизации. Обычно это не так уж много, поэтому я предпочитаю НЕ ОПТИМИЗИРОВАТЬ.
И если вы оптимизируете, следующее обновление создаст пробелы, разделив страницу на две или более. Но быстрее обновить фрагментированную таблицу, чем не фрагментированную, потому что, если таблица фрагментирована, обновление строки не обязательно разделит страницу.
Я надеюсь, это поможет вам.