Posiadając odpowiednie indeksy w swoich tabelach MySQL, możesz znacznie zwiększyć wydajność zapytań SELECT. Ale czy wiesz, że samo dodawanie indeksów do tabel jest kosztowną operacją i może zająć dużo czasu w zależności od rozmiaru tabel? W tym czasie możesz również doświadczyć obniżonej wydajności zapytań, ponieważ zasoby systemowe są również zajęte pracą nad tworzeniem indeksów. W tym poście na blogu omawiamy podejście do optymalizacji procesu tworzenia indeksu MySQL w taki sposób, aby nie miało to wpływu na zwykłe obciążenie pracą.
Tworzenie indeksu kroczącego MySQL
Nazywamy to podejście „Rolling Index Creation” – jeśli masz zestaw replik MySQL typu master-slave, możesz utworzyć indeks po jednym węźle naraz. Powinieneś utworzyć indeks tylko w węzłach podrzędnych, aby nie wpłynąć na wydajność mastera. Po zakończeniu tworzenia indeksu na podrzędnych, degradujemy obecnego nadrzędnego i promujemy jednego z aktualnych podrzędnych jako nowego nadrzędnego. W tym czasie budowanie indeksu jest kontynuowane w pierwotnym węźle głównym (który jest teraz podrzędnym). Nastąpi krótki czas (dziesiątki sekund), podczas którego utracisz łączność z bazą danych z powodu przełączenia awaryjnego, ale można to rozwiązać, ponawiając próby na poziomie aplikacji.
Zalety wydajności tworzenia indeksu kroczącego
Przeprowadziliśmy mały eksperyment, aby zrozumieć korzyści płynące z tworzenia indeksu kroczącego.
W teście wykorzystano zestaw danych MySQL utworzony za pomocą Sysbench, który zawierał 3 tabele z 50 milionami wierszy każda. Wygenerowaliśmy obciążenie mastera MySQL przy 30 klientach działających w zrównoważonym obciążeniu (50% odczytów i 50% zapisów) przez 10 minut, a jednocześnie zbudowaliśmy prosty indeks pomocniczy na jednej z tabel w dwóch scenariuszach:
- Tworzenie indeksu bezpośrednio na wzorcu
- Tworzenie indeksu na urządzeniu podrzędnym
Konfiguracja stołu testowego MySQL
Typ instancji MySQL | Instancja EC2 m4.large z 8 GB pamięci RAM |
---|---|
Typ wdrożenia | 2 Node Master-Slave Set z semisynchroniczną replikacją |
Wersja MySQL | 5.7.25 |
Wyniki wydajności
Scenariusz | Przepustowość obciążenia (zapytania na sekundę) | 95. percentyl czasu oczekiwania |
---|---|---|
Tworzenie indeksu na wzorcu | 453,63 | 670 ms |
Tworzenie indeksu kroczącego | 790,03 | 390 ms |
Na wynos
Uruchamiając tworzenie indeksu bezpośrednio na serwerze głównym MySQL, mogliśmy doświadczyć tylko 60% przepustowości, którą osiągnięto, uruchamiając tworzenie indeksu na serwerze podrzędnym MySQL za pomocą operacji kroczącej. 95-centylowe opóźnienie zapytań było również 1,8 razy większe, gdy tworzenie indeksu miało miejsce na serwerze głównym.
Najlepsze praktyki dotyczące tworzenia indeksów w tabelach #MySQLKliknij, aby tweetowaćAutomatyzacja tworzenia indeksu kroczącego
ScaleGrid automatyzuje tworzenie indeksu kroczącego dla wdrożenia MySQL za pomocą prostego interfejsu użytkownika do jego inicjowania.
W powyższym interfejsie użytkownika możesz wybrać nazwę bazy danych i tabeli oraz „Dodaj indeks” jako operację zmiany tabeli. Następnie określ nazwę kolumny i nazwę indeksu, a polecenie zmiany tabeli zostanie wygenerowane i wyświetlone. Po kliknięciu przycisku Utwórz, tworzenie indeksu będzie następować po jednym węźle na raz w sposób kroczący.
Dodatkowo ScaleGrid obsługuje również inne proste operacje zmiany tabeli, takie jak dodawanie nowej kolumny do tabeli w sposób ciągły. Czekajcie na mój kolejny post na blogu z dodatkowymi szczegółami!