sql >> Databasteknik >  >> RDS >> Mysql

Bästa praxis för att skapa index på dina MySQL-tabeller – Rullande indexbyggen

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:

  1. Skapa indexet direkt på mastern
  2. 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 tweeta

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


  1. Vad är databasbegränsningar?

  2. SQL Server lägg till primärnyckel för automatisk ökning av befintlig tabell

  3. Hur man får Oracle att skapa tabellsats i SQL*Plus

  4. Hur konverterar man rader till kolumner i Oracle?