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

MySQL/InnoDB og langvarige forespørgsler

For det første tror jeg, at det ville være nyttigt som baggrund at læse om multi-version concurrency control (MVCC) som baggrund for dette svar.

InnoDB implementerer MVCC, hvilket betyder, at den kan bruge ikke-låsende læsninger til almindelig SELECT . Dette kræver ikke oprettelse af et "snapshot", og faktisk har InnoDB ikke noget reelt koncept for et snapshot som et objekt. I stedet holder hver post i databasen styr på sit eget versionsnummer og vedligeholder en "roll pointer" til en "fortryd log"-record (som måske eller måske ikke stadig eksisterer), som ændrer rækken til dens tidligere version. Hvis der er behov for en ældre version af en post, læses den aktuelle version, og disse rullemarkører følges, og fortryd-poster anvendes, indtil en tilstrækkelig gammel version af posten er produceret.

Normalt rydder systemet konstant op i disse fortryd-logfiler og genbruger den plads, de bruger.

Enhver langvarig transaktion (bemærk, ikke nødvendigvis en enkelt forespørgsel) er til stede, skal fortryd-logfilerne opbevares (ikke slettes) for at kunne genskabe tilstrækkeligt gamle versioner af alle poster til at opfylde denne transaktion. I et meget travlt system kan disse fortryd-logfiler meget hurtigt akkumuleres og forbruge gigabyte plads. Hvis specifikke individuelle registreringer meget ofte ændres, kan det kræve mange fortryd-log-applikationer (tusindvis) at vende tilbage til en gammel nok version til at tilfredsstille forespørgslen.

Det er det, der gør "langvarige forespørgsler" dyre og ilde set. De vil øge forbruget af diskplads for at holde fortryd-logfilerne i systemets tablespace, og de vil fungere dårligt på grund af fortryd-logregistreringsapplikationen for at vende rækkeversioner tilbage ved læsning.

Nogle databaser implementerer en maksimal mængde fortryd-logplads, der kan forbruges, og når de har nået denne grænse, begynder de at smide ældre fortryd-logposter væk og ugyldiggøre kørende transaktioner. Dette genererer en "snapshot for gammel" fejlmeddelelse til brugeren. InnoDB har ingen sådan grænse og tillader akkumulering på ubestemt tid.



  1. Yii2:Kartik Gridview summen af ​​en kolonne i sidefod

  2. Huawei GaussDB

  3. Sådan fungerer SEC_TO_TIME() i MariaDB

  4. Hvad er det maksimale antal tegn for NVARCHAR(MAX)?