MySQL "genopbygger" ikke indekset på hver indsættelse.
MySQL's standardsidestørrelse er 16K. Den tildeler disse sider i intervaller på 1 MB (kaldet omfang).
Når en tabel først oprettes (indekser genopbygges), fyldes siderne 15/16 fulde, hvilket giver plads til nogle tilfældige indsættelser (1k plads). Hvis dine indeksposter er på 500 bytes hver (primær nøglestørrelse + rækkedata for et klynget indeks), giver det plads til 2 nye rækker, der skal indsættes, før siden skal opdeles.
MySQL beholder værdien af den højeste og laveste post i sidehovedet, så poster inden for et bestemt interval går på samme side.
Når MySQL skal indsætte en række på en hel side, skal siden opdeles. MySQL tilføjer en ny side og flytter halvdelen af sidedataene til den nye side.
Inden for en side er poster muligvis ikke i fysisk orden. De vil være i den rækkefølge, de blev indsat. De er linket i rækkefølge via en form for linket liste. Så selv en tilfældig indsættelse, uden for behovet for at opdele siden, medfører ikke, at data fysisk flyttes rundt.
Efter mange tilfældige indsættelser vil dine sider være fra 1/2 fulde til fulde. Et indeks med mange halvfulde sider vil påvirke læseydelsen negativt (du skal læse to halvfulde sider for at læse det samme antal poster som en 15/16. hel side).
Nu, hvis du indsætter rækker i indeksrækkefølge, så bliver MySQL simpelthen ved med at tilføje til slutningen af siderne, fylde dem 15/16 fulde og tilføje et omfang ad gangen af sider. Meget mindre præstationsstraf, da der ikke er nogen opdeling af sider, og derfor er der ingen flytning af data involveret, for ikke at nævne fordelen ved læseydelse ved næsten hele sider.
Tilfældige indsættelser øger også fragmenteringen af siderne, hvilket kan påvirke læseydelsen, hvis du ofte læser et stort antal sekventielle poster (sjældent).
Også ændre buffering kan påvirke dig.