sql >> Database >  >> RDS >> Mysql

Willekeurige PRIMAIRE SLEUTEL voor Innodb

MySQL "herbouwt" de index niet op elke insert.

Het standaard paginaformaat van MySQL is 16K. Het wijst deze pagina's toe in stappen van 1 MB (extenten genoemd).

Wanneer een tabel voor het eerst wordt gemaakt (indexen worden opnieuw opgebouwd), worden pagina's 15/16e vol, waardoor er ruimte is voor enkele willekeurige invoegingen (1k ruimte). Als uw indexitems elk 500 bytes zijn (primaire sleutelgrootte + rijgegevens voor een geclusterde index), is er ruimte voor 2 nieuwe rijen die kunnen worden ingevoegd voordat de pagina moet worden gesplitst.

MySQL bewaart de waarde van het hoogste en laagste record in de paginakoptekst, dus records binnen een bepaald bereik komen op dezelfde pagina terecht.

Wanneer MySQL een rij op een volledige pagina moet invoegen, moet de pagina worden gesplitst. MySQL zal een nieuwe pagina toevoegen en de helft van de paginagegevens naar de nieuwe pagina verplaatsen.

Binnen een pagina zijn records mogelijk niet in fysieke volgorde. Ze staan ​​in de volgorde waarin ze zijn ingevoegd. Ze zijn op volgorde gekoppeld via een vorm van gekoppelde lijst. Dus zelfs een willekeurige invoeging, buiten de noodzaak om de pagina te splitsen, zorgt er niet voor dat gegevens fysiek worden verplaatst.

Na veel willekeurige invoegingen zullen uw pagina's van 1/2 vol tot vol zijn. Een index met veel halfvolle pagina's heeft een negatief effect op de leesprestaties (u moet twee halfvolle pagina's lezen om hetzelfde aantal records te lezen als een 15/16e volledige pagina).

Als je nu rijen in indexvolgorde invoegt, dan blijft MySQL gewoon aan het einde van de pagina's toevoegen, ze 15/16 vol vullen en een mate per pagina toevoegen. Veel minder prestatieverlies omdat er geen pagina's worden gesplitst, dus er is geen verplaatsing van gegevens nodig, om nog maar te zwijgen van het leesprestatievoordeel van bijna volledige pagina's.

Willekeurige invoegingen vergroten ook de fragmentatie van de pagina's, wat de leesprestaties kan beïnvloeden als u vaak grote aantallen opeenvolgende records leest (zeldzaam).

Ook buffering wijzigen kan van invloed zijn op u.




  1. MySQL verleent alle privileges aan de database behalve één tabel

  2. Hoe het huidige Connection-object in Spring JDBC te krijgen

  3. Waarom duurt het soms zo lang voordat een invoegquery is voltooid?

  4. Selecteer de kleinste waarde uit meerdere kolommen met PHP/MySQL