sql >> Database >  >> RDS >> Mysql

Snellere manier om overeenkomende rijen te verwijderen?

Het verwijderen van gegevens uit InnoDB is de duurste operatie die u eraan kunt vragen. Zoals je al hebt ontdekt, is de query zelf niet het probleem - de meeste zullen sowieso worden geoptimaliseerd voor hetzelfde uitvoeringsplan.

Hoewel het misschien moeilijk te begrijpen is waarom DELETE's van alle gevallen het langzaamst zijn, is er een vrij eenvoudige verklaring. InnoDB is een transactionele opslagengine. Dat betekent dat als uw zoekopdracht halverwege werd afgebroken, alle records nog steeds aanwezig zouden zijn alsof er niets is gebeurd. Als het eenmaal is voltooid, is alles in hetzelfde moment verdwenen. Tijdens de DELETE zullen andere clients die verbinding maken met de server de records zien totdat uw DELETE is voltooid.

Om dit te bereiken gebruikt InnoDB een techniek genaamd MVCC (Multi Version Concurrency Control). Wat het in feite doet, is om elke verbinding een momentopname te geven van de hele database zoals deze was toen de eerste verklaring van de transactie begon. Om dit te bereiken, kan elk record in InnoDB intern meerdere waarden hebben - één voor elke snapshot. Dit is ook de reden waarom TELLEN op InnoDB enige tijd in beslag neemt - het hangt af van de momentopname die u op dat moment ziet.

Voor uw DELETE-transactie wordt elk record dat is geïdentificeerd volgens uw queryvoorwaarden, gemarkeerd voor verwijdering. Omdat andere clients mogelijk tegelijkertijd toegang hebben tot de gegevens, kan het deze niet onmiddellijk uit de tabel verwijderen, omdat ze hun respectievelijke momentopname moeten zien om de atomiciteit van de verwijdering te garanderen.

Zodra alle records zijn gemarkeerd voor verwijdering, is de transactie succesvol doorgevoerd. En zelfs dan kunnen ze niet onmiddellijk van de eigenlijke gegevenspagina's worden verwijderd, voordat alle andere transacties die met een momentopnamewaarde werkten vóór uw DELETE-transactie, ook zijn beëindigd.

Dus in feite zijn uw 3 minuten niet echt zo traag, aangezien alle records moeten worden gewijzigd om ze op een transactieveilige manier voor te bereiden op verwijdering. Waarschijnlijk zult u uw harde schijf "horen" terwijl de instructie wordt uitgevoerd. Dit wordt veroorzaakt door toegang tot alle rijen. Om de prestaties te verbeteren, kunt u proberen de bufferpool van InnoDB voor uw server te vergroten en andere toegang tot de database te beperken terwijl u VERWIJDERT, waardoor ook het aantal historische versies dat InnoDB per record. Met het extra geheugen kan InnoDB uw tabel (meestal) in het geheugen lezen en enige tijd zoeken naar de schijf vermijden.



  1. Hoe de tabel te wijzigen kolom orakel toevoegen

  2. Laad gegevens van CSV naar mySQL-database Java+hibernate+spring

  3. MySQL - Mac - Fout 2002 - Kan geen verbinding maken met lokaal... via socket

  4. Hoe de kolomkoppen te verwijderen bij het e-mailen van queryresultaten in SQL Server (T-SQL)