krótka odpowiedź:
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;
Odpowiedź „musisz wiedzieć”
najpierw musisz zrozumieć, że tabele MySQL ulegają fragmentacji, gdy wiersz jest aktualizowany, więc jest to normalna sytuacja. Gdy tworzona jest tabela, powiedzmy importowana przy użyciu zrzutu z danymi, wszystkie wiersze są przechowywane bez fragmentacji na wielu stronach o stałym rozmiarze. Po zaktualizowaniu wiersza o zmiennej długości strona zawierająca ten wiersz jest dzielona na dwie lub więcej stron w celu przechowywania zmian, a te dwie nowe (lub więcej) strony zawierają puste miejsca wypełniające nieużywane miejsce.
Nie wpływa to na wydajność, chyba że fragmentacja oczywiście wzrośnie za bardzo. Co to jest zbyt duża fragmentacja, zobaczmy zapytanie, którego szukasz:
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 i INDEX_LENGTH to przestrzeń zajmowana przez twoje dane i indeksy, a DATA_FREE to całkowita ilość bajtów nieużywanych na wszystkich stronach tabeli (fragmentacja).
Oto przykład prawdziwego stołu produkcyjnego
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
W tym przypadku mamy tabelę używającą (896 + 316) = 1212 MB, a dane mają wolne miejsce 5 MB. Oznacza to „współczynnik fragmentacji”:
5/1212 = 0.0041
... co jest naprawdę niskim „współczynnikiem fragmentacji”.
Pracuję z tabelami o współczynniku bliskim 0,2 (co oznacza 20% pustych miejsc) i nigdy nie zauważam spowolnienia zapytań, nawet jeśli zoptymalizuję tabelę, wydajność jest taka sama. Ale zastosowanie stołu optymalizacyjnego na stole 800 MB zajmuje dużo czasu i blokuje go na kilka minut, co jest niewykonalne w produkcji.
Więc jeśli weźmiesz pod uwagę to, co wygrywasz w wydajności i czas zmarnowany na optymalizację stołu, wolę NIE OPTYMALIZOWAĆ.
Jeśli uważasz, że lepiej jest do przechowywania, sprawdź swój stosunek i zobacz, ile miejsca można zaoszczędzić podczas optymalizacji. Zwykle nie jest to zbyt wiele, więc wolę NIE OPTYMALIZOWAĆ.
A jeśli zoptymalizujesz, następna aktualizacja utworzy puste miejsca, dzieląc stronę na dwie lub więcej. Ale szybsza jest aktualizacja pofragmentowanej tabeli niż niepodzielonej, ponieważ jeśli tabela jest pofragmentowana, aktualizacja w wierszu niekoniecznie podzieli stronę.
Mam nadzieję, że to Ci pomoże.