MySQL nie „odbudowuje” indeksu przy każdej wstawce.
Domyślny rozmiar strony MySQL to 16K. Przydziela te strony w przyrostach 1 MB (zwanych zakresami).
Kiedy tabela jest tworzona po raz pierwszy (indeksy są przebudowywane), strony są wypełniane w 15/16 pełnej, pozostawiając miejsce na kilka przypadkowych wstawek (1k miejsca). Jeśli wpisy indeksu mają po 500 bajtów każdy (rozmiar klucza podstawowego + dane wiersza dla indeksu klastrowego), pozostaje miejsce na wstawienie 2 nowych wierszy przed koniecznością podzielenia strony.
MySQL przechowuje wartość najwyższego i najniższego rekordu w nagłówku strony, więc rekordy z określonego zakresu trafiają na tę samą stronę.
Gdy MySQL musi wstawić wiersz na całej stronie, strona musi zostać podzielona. MySQL doda nową stronę i przeniesie połowę danych strony na nową stronę.
Na stronie rekordy mogą w rzeczywistości nie być uporządkowane fizycznie. Będą w kolejności, w jakiej zostały wstawione. Są one połączone w kolejności poprzez formę połączonej listy. Tak więc nawet losowa wstawka, poza koniecznością dzielenia strony, nie powoduje fizycznego przeniesienia danych.
Po wielu losowych wstawkach Twoje strony będą od 1/2 do pełnej. Indeks z wieloma w połowie pełnymi stronami wpłynie negatywnie na wydajność odczytu (musisz przeczytać dwie w połowie pełne strony, aby odczytać taką samą liczbę rekordów, jak jedna 15/16 pełna strona).
Teraz, jeśli wstawiasz wiersze w kolejności indeksu, MySQL po prostu kontynuuje dodawanie stron na końcu, wypełniając je w 15/16 pełnych i dodając fragmenty za każdym razem. Znacznie mniejszy spadek wydajności, ponieważ nie ma dzielenia stron, a zatem nie jest zaangażowane przenoszenie danych, nie wspominając o korzyściach związanych z wydajnością odczytu prawie pełnych stron.
Losowe wstawki zwiększają również fragmentację stron, co może wpływać na wydajność odczytu, jeśli często czytasz dużą liczbę rekordów sekwencyjnych (rzadko).
Ponadto buforowanie zmian może mieć na Ciebie wpływ.