Przeprowadziłem wiele badań dotyczących utrzymania indeksów w MySQL, aby zapobiec fragmentacji i jakoś zoptymalizować wykonywanie niektórych zapytań.
Znam tę formułę, która oblicza stosunek maksymalnej przestrzeni dostępnej dla tabeli do przestrzeni używanej przez dane i indeksy.
Jednak na moje główne pytania wciąż nie ma odpowiedzi. Być może wynika to z faktu, że znam obsługę indeksu w SQL Server i wydaje mi się, że w MySQL powinno być jakoś podobnie.
Na serwerze SQL możesz mieć kilka indeksów, a każdy z nich może mieć różne poziomy fragmentacji. Następnie możesz wybrać jeden i wykonać operację „REORGANIZACJA” lub „ODBUDOWA” w tym konkretnym indeksie, bez wpływu na resztę.
Zgodnie z moją najlepszą wiedzą nie ma „fragmentacji tabeli” jako takiej, a SQL Server nie zapewnia żadnego narzędzia do naprawy „fragmentacji tabeli”. Zapewnia narzędzia do sprawdzania fragmentacji indeksu (rozumianej jako stosunek liczby stron używanych przez indeks VS do pełnej strony i ciągłości), a także fragmentację wewnętrzną i zewnętrzną.
Wszystko to jest dość łatwe do zrozumienia, przynajmniej dla mnie.
Teraz, gdy nadchodzi kolej na utrzymanie indeksów w MySQL, istnieje tylko koncepcja fragmentacji tabeli, jak wspomniano powyżej.
Tabela w MySQL może mieć kilka indeksów, ale kiedy sprawdzam „współczynnik fragmentacji” za pomocą tej znanej formuły, nie widzę fragmentacji każdego indeksu, ale tabelę jako całość.
Kiedy chcę zoptymalizować indeksy w MySQL, nie wybieram konkretnego indeksu do działania (jak w SQL Server). Zamiast tego wykonuję operację „OPTYMALIZUJ” w całej tabeli, która prawdopodobnie wpływa na wszystkie indeksy.
Gdy tabela jest zoptymalizowana w MySQL, zmniejsza się stosunek między przestrzenią używaną przez dane + indeksy VS a całkowitą przestrzenią, co sugeruje jakąś fizyczną reorganizację na dysku twardym, co przekłada się na zmniejszenie fizycznej przestrzeni. Jednak fragmentacja indeksu dotyczy nie tylko fizycznej przestrzeni, ale także struktury drzewa, która ulegała zmianom z powodu wstawek i aktualizacji.
Wreszcie mam tabelę w InnoDB / MySQL. Ta tabela ma 3 miliony rekordów, 105 kolumn i 55 indeksów. Ma 1,5 GB z wyłączeniem indeksów, które wynoszą 2,1 GB.
Tę tabelę uderza się tysiące razy dziennie w celu aktualizacji, wstawienia (tak naprawdę nie usuwamy rekordów).
Ta tabela została stworzona wiele lat temu i wiem na pewno, że nikt nie utrzymuje indeksów.
Spodziewałem się tam znaleźć dużą fragmentację, ale kiedy wykonam obliczenia fragmentacji zgodnie z zaleceniami
free_space / (data_length + index_length)
okazuje się, że mam tylko 0,2% fragmentacji. IMHO to dość nierealne.
Główne pytania to:
- Jak sprawdzić fragmentację określonego indeksu w MySQL, a nie tabelę jako całość
- Czy OPTIMIZE TABLE naprawia fragmentację wewnętrzną / zewnętrzną indeksu jak w SQL Server?
- Kiedy optymalizuję tabelę w MySQL, czy faktycznie odbudowuje ona wszystkie indeksy w tabeli?
- Czy realistyczne jest myślenie, że zmniejszenie fizycznej przestrzeni indeksu (bez przebudowywania samego drzewa) faktycznie przekłada się na lepszą wydajność?