Użyłem MySQLTuner, który wskazał, że niektóre tabele są podzielone. użyłem
mysqlcheck --optimize -A
aby zoptymalizować wszystkie tabele. Naprawiono niektóre tabele, ale MySQLTuner nadal znajduje fragmenty 19 tabel. jak mogę zobaczyć, które tabele wymagają defragmentacji? Może TABELA OPTYMALIZACJI będzie działać tam, gdzie nie działa mysqlcheck? A co jeszcze powinienem spróbować?
Odpowiedzi:
krótka odpowiedź:
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:
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
W tym przypadku mamy tabelę używającą (896 + 316) = 1212 MB, a dane mają wolne miejsce 5 MB. Oznacza to „współczynnik fragmentacji”:
... 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.
źródło
Aby dodać do odpowiedzi Felipe-Rojasa , możesz obliczyć współczynnik fragmentów jako część zapytania:
Jeśli tabela jest podzielona na małe fragmenty (mniej niż 5%?), Prawdopodobnie możesz zostawić ją w spokoju.
Cokolwiek większego i będziesz musiał ocenić na podstawie użycia bazy danych, blokowania tabel itp., Jak ważne jest defragmentowanie tabeli.
źródło
Optymalizacja tabeli rzeczywiście rozwiąże problem, który masz.
Jeśli masz tylko kilka baz danych, możesz użyć PHPMyAdmin, aby przejrzeć wszystkie swoje bazy danych. Wybierz tabele z narzutem, a następnie wybierz, aby zoptymalizować.
Jeśli masz wiele baz danych, prawdopodobnie preferowana byłaby inna metoda.
Korzystam z następującej konfiguracji skryptu PHP w cronie, aby uruchamiał się co godzinę.
źródło
mysqlcheck --optimize -A
jest to to samo, co SQLOPTIMIZE TABLE <tablename>;
Natknąłem się na tę stronę i uznałem zapytania Felipe-Rojasa i sysadmirala za bardzo pomocne. Ale w moim przypadku uruchomiłem zapytanie w phpMyAdmin WHM i uzyskanie tylko TABLE_NAME nie było tak pomocne, ponieważ baza danych nie była wymieniona, a kilka baz danych ma te same nazwy tabel. Tak więc zwykłe dodanie
TABLE_SCHEMA
zapewni również tę kolumnę.Pokazuje DB
Aby to naprawić, użyłem linku Defragmentacja tabeli w phpMyAdmin dla każdej z tabel, co spowodowało wysoki „frag_ratio”, dla którego phpMyAdmin wykonuje:
źródło
Tabela wykorzystująca silnik InnoDB MySQL zasadniczo nigdy nie musi być
OPTIMIZEd
.Wartość
Data_free
z jednegoinformation_schema.tables
lubSHOW TABLE STATUS
bardzo często jest niezerowa, nawet jeśli myślisz, że zrobiłeś wszystko, co możesz zrobić, aby zdefragmentować swoje tabele. Co więcej, ta metryka jest tylko jedną z kilku fragmentacji, które mogą się zdarzyć. (Również zmarnowane miejsce w blokach, cofanie list, indeks BTrees vs BTrees danych itp. Itp.I
innodb_file_per_table
komplikuje użycieData_free
. Jeśli tabela jest w środkuibdata1
,Data_free
oznacza to cały obszar tabel; raczej bezużyteczna liczba. Jeśli tabela znajduje się we własnym.ibd
pliku, prawdopodobnie będzie to kilka MB lub kilka procent wielkości tabeli, w zależności od tego, która wartość jest większa.Może warto uruchomić tylko wtedy, gdy usunąłeś wiele wierszy i nie zamierzasz uzupełniać tabeli .
OPTIMIZE TABLE
PARTITIONs
pokazują również niepokojącą ilośćData_free
, ponieważ każda partycja zwykle pokazuje 4-7 MB „za darmo”. I to nie zniknie.Dlaczego Defragmentacja?
innodb_file_per_table=1
. Ale dodając wiersze, zabierzesz go z powrotem z systemu operacyjnego.Data_free
.Notatka historyczna. Kiedy pomagałem DBA w większości tabel MyISAM, odkryłem może 2 na 1000 tabel, którym pomagał miesięcznie
OPTIMIZE
. Od tego czasu pracowałem z tysiącami tabel InnoDB, jeszcze znalazłem problem z wydajnością, któremu prawdopodobnie można by pomócOPTIMIZE
. (Jasne, wystąpiły problemy z miejscem na dysku, któreOPTIMIZE
mogą pomóc, ale staje się to trudne - zwykle DBA nie ma wystarczającej ilości miejsca na dysku do uruchomieniaOPTIMIZE
!)źródło