sql >> Database teknologi >  >> RDS >> Mysql

Bedste praksis for at oprette indekser på dine MySQL-tabeller – Rullende indeksbygninger

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:

  1. Oprettelse af indekset direkte på masteren
  2. 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 tweete

Automatisk 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!


  1. Videregivelse af en række ints til T-SQL-lagrede proc via entity framework

  2. Udfør lagret procedure ved hjælp af entity framework

  3. Er det muligt at udføre krydsdatabaseforespørgsler med PostgreSQL?

  4. VMware CPU Hot Plug vNUMA Effekter på SQL Server