Genom att ha lämpliga index på dina MySQL-tabeller kan du avsevärt förbättra prestandan för SELECT-frågor. Men visste du att att lägga till index i dina tabeller i sig är en dyr operation, och kan ta lång tid att slutföra beroende på storleken på dina tabeller? Under denna tid kommer du sannolikt också att uppleva en försämrad prestanda för frågor eftersom dina systemresurser också är upptagna med att skapa index. I det här blogginlägget diskuterar vi ett tillvägagångssätt för att optimera processen för att skapa MySQL-index på ett sådant sätt att din vanliga arbetsbelastning inte påverkas.
Skapa MySQL Rolling Index
Vi kallar det här tillvägagångssättet för "Rolling Index Creation" – om du har en MySQL master-slave replica set, kan du skapa indexet en nod i taget på ett rullande sätt. Du bör skapa indexet endast på slavnoderna så att masterns prestanda inte påverkas. När indexskapandet är klart på slavarna degraderar vi den nuvarande mastern och marknadsför en av slavarna som är uppdaterad som ny master. Vid denna tidpunkt fortsätter indexbyggandet på den ursprungliga masternoden (som nu är en slav). Det kommer att vara en kort varaktighet (tiotals sekunder) under vilken du kommer att förlora anslutningen till din databas på grund av failover, men detta kan övervinnas genom att göra omförsök på applikationsnivå.
Prestandafördelar med att skapa rullande index
Vi gjorde ett litet experiment för att förstå prestandafördelarna med att skapa rullande index.
Testet använde en MySQL-datauppsättning skapad med Sysbench som hade 3 tabeller med 50 miljoner rader vardera. Vi genererade belastning på MySQL-mastern med 30 klienter som körde en balanserad arbetsbelastning (50 % läser och 50 % skriver) i 10 minuter, och byggde samtidigt ett enkelt sekundärt index på en av tabellerna i två scenarier:
- Skapa indexet direkt på mastern
- Skapar indexet på slaven
MySQL testbäddskonfiguration
MySQL-instanstyp | EC2-instans m4.large med 8 GB RAM |
---|---|
Implementeringstyp | 2 Node Master-Slave Set med semisynkron replikering |
MySQL-version | 5.7.25 |
Prestandaresultat
Scenario | Arbetsbelastningskapacitet (frågor per sekund) | 95:e percentilens latens |
---|---|---|
Indexskapande på Master | 453.63 | 670 ms |
Skapa rullande index | 790.03 | 390 ms |
Takeaway
Genom att köra indexskapande direkt på MySQL-mastern kunde vi bara uppleva 60 % av den genomströmning som uppnåddes genom att köra indexskapande på MySQL-slaven genom en rullande operation. Den 95:e percentilens latens för frågor var också 1,8 gånger högre när indexet skapades på huvudservern.
Bästa praxis för att skapa index på dina #MySQL-tabellerKlicka för att tweetaAutomatiskt skapande av rullande index
ScaleGrid automatiserar rullande indexskapande för din MySQL-distribution med ett enkelt användargränssnitt för att initiera det.
I gränssnittet ovan kan du välja ditt databas- och tabellnamn och "Lägg till index" som åtgärden Ändra tabell. Ange sedan ett kolumnnamn och indexnamn, så genereras och visas ett kommando för att ändra tabell. När du klickar för att skapa skapas indexet en nod i taget på ett rullande sätt.
Dessutom stöder ScaleGrid också andra enkla Alter Table-operationer som att lägga till en ny kolumn i din tabell på ett rullande sätt. Håll utkik efter mitt uppföljande blogginlägg med mer information!