sql >> Databasteknik >  >> RDS >> Mysql

Snabbare sätt att ta bort matchande rader?

Att ta bort data från InnoDB är den dyraste operationen du kan begära av den. Som du redan upptäckt är frågan i sig inte problemet - de flesta av dem kommer att optimeras för samma utförandeplan ändå.

Även om det kan vara svårt att förstå varför DELETEs av alla fall är de långsammaste, finns det en ganska enkel förklaring. InnoDB är en transaktionslagringsmotor. Det betyder att om din förfrågan avbröts halvvägs, skulle alla poster fortfarande vara på plats som om ingenting hade hänt. När det är klart kommer allt att försvinna i samma ögonblick. Under DELETE kommer andra klienter som ansluter till servern att se posterna tills din DELETE slutförs.

För att uppnå detta använder InnoDB en teknik som kallas MVCC (Multi Version Concurrency Control). Vad det i princip gör är att ge varje anslutning en ögonblicksbild av hela databasen som den var när det första uttalandet av transaktionen startade. För att uppnå detta kan varje post i InnoDB internt ha flera värden - ett för varje ögonblicksbild. Det är också därför det tar lite tid att räkna på InnoDB - det beror på vilket ögonblicksbildstillstånd du ser vid den tidpunkten.

För din DELETE-transaktion markeras varje post som identifieras enligt dina frågevillkor för radering. Eftersom andra klienter kan komma åt data samtidigt, kan den inte omedelbart ta bort dem från tabellen, eftersom de måste se sina respektive ögonblicksbilder för att garantera atomiciteten i raderingen.

När alla poster har markerats för radering, genomförs transaktionen framgångsrikt. Och även då kan de inte omedelbart tas bort från de faktiska datasidorna, innan alla andra transaktioner som fungerade med ett ögonblicksbildvärde innan din DELETE-transaktion, också har avslutats.

Så i själva verket är dina 3 minuter inte riktigt så långsamma, med tanke på att alla poster måste ändras för att förbereda dem för borttagning på ett transaktionssäkert sätt. Förmodligen kommer du att "höra" din hårddisk arbeta medan uttalandet körs. Detta orsakas av tillgång till alla rader.För att förbättra prestandan kan du försöka öka InnoDB buffertpoolstorlek för din server och försöka begränsa annan åtkomst till databasen samtidigt som du DELETERAR, och därmed också minska antalet historiska versioner som InnoDB måste underhålla pr. record.Med det extra minnet kanske InnoDB kan läsa din tabell (för det mesta) in i minnet och undvika lite disksökningstid.



  1. Fylla i luckor i datum som returneras från databasen - ren SQL-lösning möjlig?

  2. Kan inte kompilera GI 12.1.0.2 och segmenteringsfel

  3. PHP - Exportera MySQL-tabeller till JSON-fil

  4. Att förstå Postgres radstorlekar