sql >> Databasteknik >  >> RDS >> Mysql

MySQL/InnoDB och långvariga frågor

För det första tror jag att det skulle vara användbart som bakgrund att läsa om multiversion concurrency control (MVCC) som bakgrund till detta svar.

InnoDB implementerar MVCC, vilket innebär att den kan använda icke-låsande läsningar för vanliga SELECT . Detta kräver inte att man skapar en "snapshot" och faktiskt har InnoDB inte något riktigt koncept för en ögonblicksbild som ett objekt. Istället håller varje post i databasen reda på sitt eget versionsnummer och upprätthåller en "rullningspekare" till en "ångra logg"-post (som kanske eller kanske inte fortfarande finns) som ändrar raden till dess tidigare version. Om en äldre version av en post behövs läses den aktuella versionen och dessa roll-pekare följs och ångra poster tillämpas tills en tillräckligt gammal version av posten produceras.

Normalt rensar systemet ständigt upp dessa ångra-loggar och återanvänder det utrymme de förbrukar.

När som helst någon långvarig transaktion (observera, inte nödvändigtvis en enda fråga) finns, måste ångraloggarna behållas (inte rensas) för att tillräckligt gamla versioner av alla poster ska kunna återskapas för att tillgodose den transaktionen. I ett mycket upptaget system kan dessa ångraloggar mycket snabbt ackumuleras för att konsumera gigabyte utrymme. Om specifika individuella poster dessutom ändras mycket ofta, kan det ta väldigt många ångra loggapplikationer (tusentals) att återställa posten till en tillräckligt gammal version för att tillfredsställa frågan.

Det är det som gör "långa frågor" dyra och ogillade. De kommer att öka diskutrymmesförbrukningen för att behålla ångraloggarna i systemets tabellutrymme, och de kommer att fungera dåligt på grund av att ångra loggpostapplikationen återställer radversioner vid läsning.

Vissa databaser implementerar en maximal mängd ångra loggutrymme som kan konsumeras, och när de har nått den gränsen börjar de kasta bort äldre ångra loggposter och ogiltigförklara pågående transaktioner. Detta genererar ett "snapshot too old"-felmeddelande till användaren. InnoDB har ingen sådan gräns och tillåter ackumulering på obestämd tid.



  1. Bevilja val på alla tabeller som ägs av en specifik användare

  2. Skapa en webbplats med MySQL

  3. Hantera mysql-omstart i SQLAlchemy

  4. Visa alla aktuella lås från get_lock