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

Hurtigere måde at slette matchende rækker på?

Sletning af data fra InnoDB er den dyreste operation, du kan anmode om. Som du allerede har opdaget, er selve forespørgslen ikke problemet - de fleste af dem vil alligevel blive optimeret til den samme udførelsesplan.

Selvom det kan være svært at forstå, hvorfor DELETE af alle tilfælde er de langsomste, er der en ret simpel forklaring. InnoDB er en transaktionslagringsmotor. Det betyder, at hvis din forespørgsel blev afbrudt halvvejs, ville alle registreringer stadig være på plads, som om intet skete. Når det er færdigt, vil alt være væk på samme øjeblik. Under DELETE vil andre klienter, der opretter forbindelse til serveren, se posterne, indtil din SLETNING er fuldført.

For at opnå dette bruger InnoDB en teknik kaldet MVCC (Multi Version Concurrency Control). Hvad det grundlæggende gør, er at give hver forbindelse et øjebliksbillede af hele databasen, som den var, da den første erklæring af transaktionen startede. For at opnå dette kan hver post i InnoDB internt have flere værdier - en for hvert øjebliksbillede. Det er også grunden til, at det tager noget tid at optælling på InnoDB - det afhænger af den øjebliksbillede, du ser på det tidspunkt.

For din DELETE-transaktion bliver hver eneste post, der er identificeret i henhold til dine forespørgselsbetingelser, markeret til sletning. Da andre klienter muligvis får adgang til dataene på samme tid, kan den ikke fjerne dem straks fra bordet, fordi de skal se deres respektive snapshot for at garantere sletningens atomicitet.

Når alle poster er blevet markeret til sletning, er transaktionen gennemført. Og selv da kan de ikke umiddelbart fjernes fra de faktiske datasider, før alle andre transaktioner, der fungerede med en øjebliksbilledeværdi før din DELETE-transaktion, også er afsluttet.

Så faktisk er dine 3 minutter ikke så langsomme i betragtning af, at alle poster skal ændres for at forberede dem til fjernelse på en transaktionssikker måde. Sandsynligvis vil du "høre" din harddisk arbejde, mens sætningen kører. Dette er forårsaget af adgang til alle rækkerne. For at forbedre ydeevnen kan du forsøge at øge InnoDB-bufferpuljens størrelse for din server og forsøge at begrænse anden adgang til databasen, mens du SLETTER, og derved også reducere antallet af historiske versioner, som InnoDB skal vedligeholde pr. record.Med den ekstra hukommelse kan InnoDB muligvis læse din tabel (for det meste) ind i hukommelsen og undgå disksøgningstid.



  1. Generer klasse fra databasetabel

  2. MySql forskel mellem to tidsstempler i sekunder?

  3. Bruger EXCEPT-klausulen i PostgreSQL

  4. Sådan fungerer TIME_TO_SEC() i MariaDB