sql >> Database >  >> RDS >> Mysql

MySQL/InnoDB en langlopende queries

Ten eerste denk ik dat het nuttig zou zijn als achtergrond om meer te lezen over multi-version concurrency control (MVCC) als achtergrond voor dit antwoord.

InnoDB implementeert MVCC, wat betekent dat het non-locking reads kan gebruiken voor reguliere SELECT . Dit vereist geen "snapshot" en in feite heeft InnoDB geen echt concept van een snapshot als object. In plaats daarvan houdt elk record in de database zijn eigen versienummer bij en houdt het een "roll pointer" bij naar een "undo log" record (die al dan niet nog bestaat) die de rij wijzigt naar zijn vorige versie. Als een oudere versie van een record nodig is, wordt de huidige versie gelezen en worden die roll-pointers gevolgd en worden records ongedaan gemaakt totdat een voldoende oude versie van het record is geproduceerd.

Normaal gesproken is het systeem constant bezig met het opschonen van die logs voor ongedaan maken en hergebruikt het de ruimte die ze innemen.

Op elk moment een langlopende transactie (let op, niet noodzakelijk een enkele zoekopdracht) aanwezig is, moeten de ongedaanmakingslogboeken worden bewaard (niet gewist) om voldoende oud genoeg versies van alle records opnieuw te creëren om aan die transactie te voldoen. In een erg druk systeem kunnen die ongedaanmakingslogboeken zich zeer snel ophopen om gigabytes aan ruimte in beslag te nemen. Bovendien, als specifieke individuele records zeer vaak worden gewijzigd, kan het terugzetten van die record naar een versie die oud genoeg is om aan de zoekopdracht te voldoen, heel veel ongedaan maken van logtoepassingen (duizenden) kosten.

Dat is wat "langlopende zoekopdrachten" duur en afgekeurd maakt. Ze zullen het schijfruimteverbruik verhogen voor het bewaren van de ongedaanmakingslogboeken in de systeemtabelruimte, en ze zullen slecht presteren vanwege de toepassing voor het ongedaan maken van logboekrecords om rijversies na het lezen terug te zetten.

Sommige databases implementeren een maximale hoeveelheid ongedaan logboekruimte die kan worden verbruikt, en zodra ze die limiet hebben bereikt, beginnen ze oudere logboekrecords voor ongedaan maken weg te gooien en lopende transacties ongeldig te maken. Dit genereert een "snapshot te oud" foutmelding voor de gebruiker. InnoDB heeft zo'n limiet niet en staat accumulatie voor onbepaalde tijd toe.



  1. MySQL verwijderen met groeperen op

  2. Wat is het verschil tussen mysql.createConnection en mysql.createPool in de Node.js MySQL-module?

  3. Invoegen in een tabel met een streepje in de naam

  4. Index viel buiten de grenzen van de array. (Microsoft.SqlServer.smo)