Ved at have passende indekser på dine MySQL-tabeller kan du i høj grad forbedre ydeevnen af SELECT-forespørgsler. Men vidste du, at tilføjelse af indekser til dine tabeller i sig selv er en dyr operation og kan tage lang tid at fuldføre afhængigt af størrelsen på dine tabeller? I løbet af denne tid vil du sandsynligvis også opleve en forringet ydelse af forespørgsler, da dine systemressourcer også er travle med at oprette indeks. I dette blogindlæg diskuterer vi en tilgang til at optimere MySQL-indeksoprettelsesprocessen på en sådan måde, at din almindelige arbejdsbyrde ikke påvirkes.
Oprettelse af MySQL rullende indeks
Vi kalder denne tilgang for en 'Rolling Index Creation' - hvis du har et MySQL master-slave replikasæt, kan du oprette indekset én node ad gangen på en rullende måde. Du bør kun oprette indekset på slaveknuderne, så masterens ydeevne ikke påvirkes. Når indeksoprettelse er afsluttet på slaverne, degraderer vi den nuværende master og forfremmer en af de slaver, der er opdateret som den nye master. På dette tidspunkt fortsætter indeksbygningen på den originale masterknude (som nu er en slave). Der vil være en kort varighed (tivis af sekunder), hvor du vil miste forbindelsen til din database på grund af failover, men dette kan overvindes ved at få genforsøg på applikationsniveau.
Ydeevnefordele ved oprettelse af rullende indeks
Vi lavede et lille eksperiment for at forstå ydeevnefordelene ved oprettelse af rullende indeks.
Testen brugte et MySQL-datasæt oprettet ved hjælp af Sysbench, som havde 3 tabeller med hver 50 millioner rækker. Vi genererede belastning på MySQL-masteren med 30 klienter, der kørte en afbalanceret arbejdsbelastning (50 % læser og 50 % skriver) i 10 minutter, og byggede samtidig et simpelt sekundært indeks på en af tabellerne i to scenarier:
- Oprettelse af indekset direkte på masteren
- Oprettelse af indekset på slaven
MySQL Test Bed Configuration
MySQL-instanstype | EC2-instans m4.large med 8 GB RAM |
---|---|
Implementeringstype | 2 Node Master-Slave Set med semisynkron replikering |
MySQL-version | 5.7.25 |
Ydeevneresultater
Scenarie | Workload Throughput (Forespørgsler pr. sekund) | 95. Percentil Latency |
---|---|---|
Oprettelse af indeks på master | 453.63 | 670 ms |
Oprettelse af rullende indeks | 790.03 | 390 ms |
Takeaway
Ved at køre indeksoprettelse direkte på MySQL-masteren kunne vi kun opleve 60 % af den gennemstrømning, der blev opnået ved at køre indeksoprettelse på MySQL-slaven gennem en rullende operation. 95. percentilens latens for forespørgsler var også 1,8 gange højere, da indeksoprettelsen skete på masterserveren.
Bedste praksis for at oprette indekser på dine #MySQL-tabellerKlik for at tweeteAutomatisk oprettelse af rullende indeks
ScaleGrid automatiserer oprettelsen af rullende indeks til din MySQL-implementering med en simpel brugergrænseflade til at starte den.
I brugergrænsefladen ovenfor kan du vælge dit database- og tabelnavn og 'Tilføj indeks' som ændring af tabelhandlingen. Angiv derefter et kolonnenavn og et indeksnavn, og en ændre tabelkommando vil blive genereret og vist for dig. Når du klikker for at oprette, vil indeksoprettelsen ske én node ad gangen på en rullende måde.
Derudover understøtter ScaleGrid også andre simple Alter Table-operationer som f.eks. at tilføje en ny kolonne til din tabel på en rullende måde. Hold øje med mit opfølgende blogindlæg med flere detaljer!