Wydajność wersji MySQL jest mierzalny pod względem czasu odpowiedzi, przepustowości zapytań i skalowania pod obciążeniem. W tym artykule wykorzystam rzeczywiste testy porównawcze, aby pokazać, jak MySQL 5.7, 8.0, 8.4, 9.1 i 9.2 działają pod obciążeniem. Prędkość i skalowalności oraz które kroki dostrajania są opłacalne.
Punkty centralne
- Wersja wybierz: 8.0+ skaluje się znacznie lepiej przy wysokiej współbieżności.
- QPS-Zyski: do +50% vs. 5,7 wraz ze wzrostem liczby wątków.
- 8.4/9.xukierunkowane optymalizacje dla zapisów i JOIN.
- StrojeniePrawidłowe ustawienie puli buforów, wątków, sortowania i parametrów dziennika.
- TestySprawdź, czy sysbench działa na docelowym sprzęcie.
Podstawy wydajności MySQL
Skupiam się na podstawowych tematach, które sprawiają, że MySQL jest szybki: Zapytania, indeksy, pamięć i IO. InnoDB czerpie znaczne korzyści z dobrego zarządzania buforami, czystego projektu schematu i dokładnych strategii indeksowania. Nowoczesne wersje zmniejszają obciążenie harmonogramu i poprawiają operacje binlog, co skraca czas oczekiwania. Mierzę wymierne efekty, szczególnie w przypadku planów JOIN, skanowania indeksów i kontroli wątków. Jeśli zależy Ci na wydajności, nadaj jej priorytet Schemat i konfigurację przed aktualizacją sprzętu.
MySQL 5.7 vs. 8.0: skalowanie i QPS
Przy niskim poziomie równoległości, 5.7 zapewnia solidną wydajność, ale wraz ze wzrostem liczby wątków Skalowanie 8.0 może wytrzymać wyższą współbieżność i często zwiększa QPS dla obciążeń OLTP o 30-50% w porównaniu do 5.7. Indeksy zstępujące unikają sortowania plików i znacznie przyspieszają odczyty. Widzę największy wzrost w operacjach wierszowych InnoDB i mieszanych transakcjach odczytu/zapisu. Jednak większa przepustowość kosztuje trochę więcej CPU, co zwykle pozostaje akceptowalne na obecnym sprzęcie.
8.0 Enterprise vs Community: co pokazują testy porównawcze
W pomiarach Sysbench, 8.0.35 Enterprise często osiąga wyniki o 21-34% wyższe QPS niż wydanie społecznościowe. Przewaga wynika ze zoptymalizowanych struktur wewnętrznych i lepszej obsługi wątków. Wcześniejsze wydania 8.0 czasami wykazywały regresje z DELETE/UPDATE, które późniejsze poprawki wyeliminowały. Dlatego biorę pod uwagę poziomy poprawek i specjalnie testuję krytyczne zapytania. Jeśli skalujesz w przewidywalny sposób, obliczasz wartość dodaną w stosunku do wyższych CPU-Decyzje dotyczące obciążenia i edycji.
Postępy w 8.4 i 9.x w skrócie
W wersjach 8.4.3 i 9.1.0 zmiany w śledzeniu zależności binlog znacznie zwiększają obciążenie zapisem, około +19,4% dla aktualizacji. Optymalizacje JOIN (+2,17%) i lepsze skanowanie zakresów indeksów (+2,12%) dodają przyrostowe zyski. W wielu obciążeniach widzę około +7,25% dla zapisów i +1,39% dla odczytów. 9.1.0 jest tylko minimalnie (≈0,68%) za 8.4.3, ale zbliża się do 8.0.40. W scenariuszach podobnych do TPC-C, 9.2 jest często uważany za najlepszy wynik. Skalowalność i stały, zwłaszcza powyżej 128 wątków.
| Wersja | Podstawowa zaleta | Typowy zysk | Uwaga |
|---|---|---|---|
| 5.7 | Niski Współbieżność | - | Łatwy w obsłudze, gorzej skaluje się pod dużym obciążeniem. |
| 8.0 | Schodzenie Indeksy, lepsze wątki | +30-50% QPS vs. 5.7 | Większe wykorzystanie procesora, wyraźne korzyści z OLTP. |
| 8.4.3 | Zoptymalizowana zależność binlog | Zapisy +7,25% | Dodatkowe korzyści z JOIN i skanowania zakresu. |
| 9.1.0 | Dokładne dostrojenie na Optymalizator i rejestrowanie | ≈-0.68% vs. 8.4.3 | Zbliżone do 8.4.3; spójne wyniki. |
| 9.2 | Wysoka liczba wątków | Top z >128 gwintami | Bardzo dobry Skalowanie podczas pracy przy dużym obciążeniu. |
Używam tej tabeli jako pomocy w podejmowaniu decyzji: najpierw obciążenie, potem wersja, potem dostrajanie. Ci, którzy pracują intensywnie przy zapisie, będą bardziej odczuwać 8.4/9.x. Aplikacje zdominowane przez odczyt już odnoszą zauważalne korzyści z wersji 8.0. Dla stabilnego wzrostu, 9.2 pozostaje bezpiecznym wyborem. To, co pozostaje ważne, to czysty strategia pomiarowa na docelowy sprzęt.
Prawidłowe odczytywanie i używanie testów porównawczych OLTP
Nie oceniam benchmarków w izolacji, ale w kontekście moich własnych celów dotyczących opóźnień i przepustowości. Operacje tylko do odczytu, wybieranie punktowe i zapis do odczytu zachowują się inaczej i wymagają różnych analiz. Interpretacja. Szczyty QPS są przekonujące tylko wtedy, gdy 95/99 percentyl pozostaje stabilny. Obciążenia produkcyjne często łączą krótkie SELECT z intensywnymi fazami UPDATE/INSERT. Wstępne kroki optymalizacji można znaleźć w kompaktowym dokumencie Wskazówki dotyczące tuningu, zanim wejdę głębiej.
Strojenie: Konfiguracja z efektem
Ustawiłem Pula buforowa zwykle do około 70% dostępnej pamięci RAM, tak aby gorące dane pozostały w pamięci. parallel_query_threads używam w kontrolowany sposób, ponieważ zbyt duża równoległość jest kusząca, ale ogranicza zależności. sort_buffer_size zwiększam w razie potrzeby i unikam globalnych przesad. Ustawienia binlog i strategie spłukiwania wpływają na opóźnienia i Przepustowość zauważalne. Mierzę każdą zmianę przed kontynuowaniem obracania, zapewniając w ten sposób powtarzalność. Efekty.
Dźwignie konfiguracji, które są często pomijane
- Redo/Undo:
innodb_log_file_sizeorazinnodb_redo_log_capacityaby punkty kontrolne nie były naciskane zbyt często bez przekraczania czasu odzyskiwania. W przypadku faz zapisu obliczam z >4-8 GB redo jako punktem wyjścia i weryfikuję za pomocą pomiarów poziomu redo. - Spłukiwanie/IO:
innodb_flush_neighborswyłączone na nowoczesnych dyskach SSD/NVMe,innodb_io_capacity(_max)do rzeczywistego IOPS, aby spłukiwanie LRU nie następowało falami. - Bufor zmian: W przypadku wielu zapisów indeksów drugorzędnych Zmień bufor pomoc; sprawdź w monitoringu, czy faktycznie zmniejsza lub zmienia ciśnienie.
- Tabele Tmp:
tmp_table_sizeorazmax_heap_table_sizewymiar tak, aby częste małe sortowania pozostawały w pamięci RAM; optymalizuj duże, rzadkie sortowania zamiast nadmuchiwać je globalnie. - Dołącz/sortuj:
join_buffer_sizeorazsort_buffer_sizetylko umiarkowanie, ponieważ są przydzielane na wątek. Najpierw optymalizuję indeksy/plany, a bufory na końcu. - Trwałość:
sync_binlog,innodb_flush_log_at_trx_commitorazbinlog_group_commitświadomie: 1/1 jest maksymalnie bezpieczne, wyższe wartości zmniejszają opóźnienie z obliczalnym ryzykiem.
Silniki pamięci masowej i wzorce obciążeń
InnoDB jest standardem, ale obciążenia różnią się znacznie. Sprawdzam, czy indeksy drugorzędne, ograniczenia FK i funkcje ACID są kompatybilne z rzeczywistymi obciążeniami. Przypadek użycia wsparcie. Archiwizacja starych danych zmniejsza obciążenie tabel podstawowych i utrzymuje małe zestawy robocze. Aby uzyskać podstawową wiedzę na temat silników, kompaktowy przegląd, taki jak InnoDB kontra MyISAM. Ostatecznie liczy się to, że silnik, indeksy i zapytania razem tworzą spójną całość. Profil wynik.
Planowanie ścieżek aktualizacji bez ryzyka
Aktualizację przeprowadzam etapami: 5.7 → 8.0 → 8.4/9.x, w połączeniu z kontrolą regresji. Przed zmianą zamrażam zmiany schematu i tworzę powtarzalne Testy. Następnie porównuję plany zapytań, percentyle i blokady. Niebiesko-zielone strategie lub przełączanie awaryjne read-replica skracają czas przestojów. Ci, którzy prawidłowo planują, szybko skorzystają z nowych Cechy i wyższą wydajność.
Metodologia monitorowania i testowania
Dokonuję pomiarów za pomocą Sysbench, uzupełniając metryki z Performance Schema i narzędzi takich jak Percona Toolkit. Bardziej decydujące niż wysoka wartość średnia są 95/99 percentyle i wartość procentowa. wariancja. Analizy skrótów zapytań odkrywają kosztowne wzorce, zanim staną się one kosztowne. Powtórki rzeczywistych obciążeń produkcyjnych dostarczają lepszych informacji niż same testy syntetyczne. Bez ciągłego Monitoring aktualizacje pozostają ślepe.
MariaDB vs. MySQL: pragmatyczny wybór
MariaDB 11.4 osiąga wyniki w niektórych scenariuszach INSERT z przewagą 13-36% nad MySQL 8.0. MySQL 8.0 błyszczy w OLTP i dużej liczbie wątków, podczas gdy 9.2 jest najsilniejszy w >128 wątkach. Skalowanie pokazuje. Decyduję w zależności od obciążenia: Write-heavy z wieloma małymi transakcjami lub mieszane obciążenie OLTP z licznymi odczytami. Oba systemy zapewniają wiarygodne wyniki, jeśli konfiguracja i schemat są prawidłowe. Wybór pozostaje kwestią Obciążenie pracą, doświadczenie zespołu i plan działania.
Stabilność planu, statystyki i sztuczki z indeksami
Aktualizacja rzadko przynosi tylko większą przepustowość, ale także nowe heurystyki optymalizatora. Zapewniam stabilność planu poprzez świadome kontrolowanie analiz i statystyk. Trwałe statystyki i regularny ANALYZE TABLE Biegi utrzymują realistyczne kardynalności. Tam, gdzie rozkłady danych są silnie skośne, funkcja Histogramy (w wersji 8.0+) często bardziej niż ogólne rozszerzenia indeksów. Dla wrażliwych zapytań, specjalnie ustawiam Wskazówki dotyczące optymalizatora, ale oszczędnie, aby przyszłe wersje mogły nadal swobodnie optymalizować.
Niewidoczne indeksy Używam go do testowania efektu usunięcia indeksu bez ryzyka. Indeksy funkcjonalne oraz Wygenerowane kolumny przyspieszyć częste filtrowanie wyrażeń lub pól JSON i uniknąć kosztownych filesort/tmp-zmiana ścieżki. Utrzymuję klucze podstawowe monotoniczne (AUTO_INCREMENT lub warianty UUID oparte na czasie), aby podziały stron i zapisy indeksów wtórnych nie wymknęły się spod kontroli. Jeśli pochodzisz z losowych identyfikatorów UUID, zmierz wpływ zmiany na lokalność wstawiania i Spłukiwanie-Ostatni.
Replikacja i przełączanie awaryjne z naciskiem na wydajność
Dla wysokiej szybkości zapisu wybieram ROW-oparte na binlogach z sensownym grupowaniem (zobowiązanie grupowe) i zmierzyć kompromis między sync_binlog=1 i 0/100. skalowane na replikach slave_parallel_workers (resp. replica_parallel_workers) z 8.0+ znacznie lepiej, jeśli Śledzenie zależności działa prawidłowo. W scenariuszach przełączania awaryjnego półsynchronizacja przyspiesza RTO, ale może zwiększać opóźnienia - aktywuję ją selektywnie na ścieżkach krytycznych.
Zwracam uwagę na szczegóły: binlog_checksum i kompresja kosztują CPU, ale oszczędzają IO; binlog_expire_logs_seconds zapobiega wzrostowi dziennika. Na replikach przechowuję tylko do odczytu ściśle w celu uniknięcia rozbieżności i przetestowania Opóźniona replikacja jako ochrona przed błędnymi aktualizacjami masowymi. W przypadku szczytów obciążenia pomocne jest tymczasowe rozluźnienie parametrów płukania binlogów, o ile pozwalają na to SLO i RTO.
Zarządzanie połączeniami i wątkami
Wiele wąskich gardeł nie występuje w pamięci masowej, ale w Obsługa połączeń. Trzymam max_connections realistyczny (nie maksymalny), zwiększyć thread_cache_size i polegać przede wszystkim na Pule połączeń aplikacji. Skaluję krótkie, częste połączenia poprzez pooling, a nie poprzez nagie numery połączeń. wait_timeout oraz interactive_timeout Ograniczam ich, by unikali trupów i obserwowali Threads_running vs. Threads_connected.
Przy wysokiej równoległości, dławię selektywnie: innodb_thread_concurrency Zwykle zostawiam 0 (auto), ale interweniuję, jeśli obciążenia nadmiernie zmieniają kontekst. table_open_cache oraz table_definition_cache aby gorące schematy nie były stale ponownie otwierane. W 8.0+ scheduler korzysta z lepszych muteksów; niemniej jednak zapobiegam grzmiące stada, wykorzystując backoff aplikacji i wykładniczy retry zamiast twardych pętli.
Sprzęt, system operacyjny i rzeczywistość kontenerowa
MySQL wykorzystuje nowoczesny sprzęt tylko wtedy, gdy ma odpowiednie podstawy. Na maszynach NUMA przypinam pamięć RAM (z przeplotem) lub wiążę proces z kilkoma węzłami, aby uniknąć opóźnień między węzłami. Przejrzyste ogromne strony Dezaktywuję również swapowanie; IO scheduler jest ustawiony na brak (NVMe) lub. mq-deadline. Naprawiam skalowanie procesora do gubernatora wydajności, aby szczyty opóźnień nie wynikały ze zmian częstotliwości.
Na poziomie systemu plików zwracam uwagę na czyste wyrównanie i opcje montowania, a także oddzielam binlog, redo i dane, jeśli dostępnych jest wiele NVMe. W kontenerach twardo ustawiam zasoby (zestawy CPU, limity pamięci) i testuję zachowanie Fsync warstwy pamięci masowej. Cgroup throttling inaczej wyjaśnia rzekome „błędy DB“. Każdy, kto wirtualizuje, sprawdza kontrolę przerwań, pamięć podręczną zapisu i kontroler podtrzymywany bateryjnie - i weryfikuje, czy O_DIRECT jest faktycznie przepuszczany.
Model danych, zestawy znaków i wydajność pamięci masowej
Podczas aktualizacji do wersji 8.0+ utf8mb4 Standard - dobre dla kompatybilności, ale indeksy i rozmiar wiersza rosną. Sprawdzam długości bardziej hojnie VARCHAR i celowo ustawiam koligacje, aby kontrolować koszty sortowania. Utrzymuję małe typy danych (np. INT zamiast BIGINT, jeśli to możliwe) i używać GENEROWANE aby umożliwić indeksowanie obliczanych filtrów. Kompresja jest opłacalna w przypadku bardzo dużych tabel, jeśli dostępny jest budżet procesora; w przeciwnym razie zyskuję więcej na redukcji zbiorów gorących (archiwizacja, partycjonowanie) niż na surowych poziomach kompresji.
Klucze podstawowe to polityka wydajności: klucze monotoniczne ułatwiają Wstaw miejscowość i zmniejszają podziały stron; losowe klucze powodują opóźnienia i wzmocnienie zapisu. Regularnie czyszczę indeksy pomocnicze - koszty „miło mieć“ są liniowe w obciążeniach zapisu. Oceniam cel i częstotliwość zapytań przed utrzymaniem indeksów.
Testuj bezpiecznie, wdrażaj bezpiecznie
Strukturyzuję wydania w fazach: Shadow traffic przeciwko identycznej instancji 8.0/8.4/9.x, a następnie stopniowa zmiana ruchu (Canary, 5-10-25-50-100%). Porównuję plany zapytań za pomocą analizy skrótów; w przypadku odchyleń wyjaśniam, czy histogramy, podpowiedzi lub indeksy zamykają ścieżkę regresji. Ważny punkt: 8.0 przynosi nowe Słownik danych; Powrót do wersji 5.7 jest praktycznie niemożliwy - kopie zapasowe są zatem obowiązkowe przed każdym ostatecznym przełączeniem.
Symuluję przełączanie awaryjne, symuluję czasy restartu i zachowanie replikacji w rzeczywistych warunkach oraz sprawdzam retencję dziennika pod kątem możliwych przewinięć. Cofnięcie Planuję pragmatycznie: przełączanie konfiguracji, flagi funkcji, szybkie wycofywanie do poprzednich kompilacji, a nie tylko do wersji DB. I dokumentuję każdy krok dostrajania za pomocą metryk - bez punktów pomiarowych nie ma efektu uczenia się dla następnej iteracji.
Podsumowanie i przewodnik decyzyjny
Mogę powiedzieć: 8.0 zapewnia duże skoki QPS w porównaniu do 5.7, 8.4/9.x pcha zapisy i JOIN dalej do przodu. Każdy, kto planuje więcej niż 128 wątków, odniesie ogromne korzyści z 9.2 i spójności Strojenie. Najszybsze zyski osiągam dzięki rozmiarowi puli buforów, odpowiednim indeksom i czystym ustawieniom binlog. Następnie liczy się projektowanie zapytań, analiza opóźnień i ścieżka aktualizacji bez niespodzianek. Dzięki tej mapie drogowej Wydajność mierzalnie i niezawodnie.


