sql >> Database >  >> RDS >> Mysql

InnoDB vergrendelingsprestaties op rijniveau - hoeveel rijen?

Het is niet helemaal duidelijk wat je vraagt. Vergrendelen zorgt ervoor dat slechts één gebruiker tegelijkertijd probeert een bepaalde rij te wijzigen. Vergrendeling op rijniveau betekent dat alleen de rij die ze wijzigen, is vergrendeld. De gebruikelijke alternatieven zijn om ofwel de hele tabel te vergrendelen voor de duur van de wijziging, of om een ​​subset van de tabel te vergrendelen. Vergrendeling op rijniveau reduceert eenvoudig die subset van de rijen tot het kleinste aantal dat nog steeds de integriteit garandeert.

Het idee is om één gebruiker één ding te laten wijzigen zonder dat andere gebruikers andere dingen kunnen wijzigen. Het is echter vermeldenswaard dat dit in sommige gevallen als het ware een vals positief kan zijn. Een paar databases ondersteunen vergrendeling op rijniveau, maar maken een vergrendeling op rijniveau aanzienlijk duurder dan het vergrendelen van een groter deel van de tabel -- genoeg duurder dat het contraproductief kan zijn.

Bewerken:je bewerking van het originele bericht helpt, maar niet echt veel. Allereerst hebben de grootte van rijen en hardwareniveaus een enorm effect (het invoegen van een rij van 8 bytes op een tiental gestreepte 15K SAS-harde schijven is net iets sneller dan het invoegen van een rij van één megabyte op een enkele harde schijf van consumentenklasse ).

Ten tweede gaat het grotendeels om het aantal gelijktijdige gebruikers, dus het patroon van invoeging maakt een groot verschil. 1000 rijen die om 3 uur 's nachts zijn ingevoegd, zullen waarschijnlijk helemaal niet worden opgemerkt. 1000 rijen die gelijkmatig over de dag worden ingevoegd, betekent iets meer (maar waarschijnlijk slechts een beetje). 1000 rijen die als batch worden ingevoegd wanneer 100 andere gebruikers gegevens onmiddellijk nodig hebben, kan iemand ontslagen worden (vooral als een van die 100 de eigenaar van het bedrijf is).



  1. mysqli gebruiken om sql-injectie te voorkomen, hoe stel ik NULL of CURRENT_DATE in?

  2. MYSQL:COUNT met GROUP BY, LEFT JOIN en WHERE-clausule retourneert geen nulwaarden

  3. Hoe sla ik een string langer dan 4000 karakters op in een Oracle Database met Java/JDBC?

  4. Wat is Greenplum-database? Inleiding tot de Big Data-database