коротка відповідь:
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 Мб займає багато часу і блокує таблицю протягом декількох хвилин, що неможливо в виробництві.
Отже, якщо врахувати, що ви виграєте у продуктивності та витрачений час на оптимізацію таблиці, я вважаю за краще НЕ ОПТИМІЗУВАТИ.
Якщо ви вважаєте, що це краще для зберігання, перегляньте ваше співвідношення та подивіться, скільки місця ви можете заощадити під час оптимізації. Зазвичай це не надто багато, тому я вважаю за краще НЕ ОПТИМІЗУВАТИ.
А якщо оптимізувати, наступне оновлення створить порожні пробіли, розділивши сторінку на дві або більше. Але швидше оновити фрагментовану таблицю, ніж не фрагментовану, тому що, якщо таблиця фрагментована, оновлення на рядок необов'язково розбиває сторінку.
Я сподіваюся, що це вам допоможе.