Nudge am 23.01.2009
MySQL Performance Quiz
in MySQL, Witziges | Tags: Index, MySQL, Performance, phpmyadminAlso Leute, ich habe gerade über folgende Frage nachgedacht:
Ist MySQL schneller, wenn der Index lückenlos ist?
Anderherum gefragt: Ist es langsamger, Abfragen über eine zB mit 1 Million Datensätzen gefüllten Tabelle zu machen, wenn der Index durch viele Löschoperationen “fragmentiert” ist und man ausschließlich den Index für die Suchanfrage benutzt?
Ich werde diese Frage in den nächsten Tagen mal untersuchen. Bis dahin seid ihr aufgefordert, eure Tipps aus dem Bauch heraus abzugeben, gern auch mit ausschmückenden Erläuterungen. 🙂 Natürlich ist es wegen Fairness striktestestestens verboten, das Ergebnis vor der Abgabe eines Tipps zu recherchieren!
Also, ich halte die Voraussetzungen noch einmal fest:
- Beide Tabellen sind gleich aufgebaut.
- Beide Tabellen haben die gleiche Anzahl an Einträgen.
- Beide Tabellen benutzen als Schlüssel id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT.
- Beide Tabellen werden vor dem Test über phpmyadmin optimiert.
- Es werden nur Anfragen auf den Index verwendet.
Aber:
- Bei einer der Tabellen sind durch vorige Löschoperationen “Lücken” im Index.
- In der anderen sind die Indizes durchgängig nummeriert.
Ich freu mich schon auf das Ergebnis! 🙂
So, heute mein Tipp (wenn es schon gestern nicht mit dem Lotto klappte):
Es ist gleich schnell. Und zwar denke ich ist es so:
MySQL versteht, dass der Query nur den Index benutzt und kann also den
Index in die Pages kopieren, gerade so viel wie reinpasst. Nun wird also
geschaut, ob der gewünschte Eintrag im Index ist – wohl per Quicksort-ähnlichem
Algorithmus, wo die Laufzeit nicht-linear (log n) wächst. Es ist also fast unbedeutend,
wieviele Index-Werte in einer Page sind, weil pro Schritt logarithmisch mehr Werte
abgefragt werden können. Lücken im Index bedeuten allerdings auch, dass
eine Page einen größeren Wertebereich abdeckt.
Je nachdem, wieviele Index-Pages gebraucht werden, kann also die lineare Variante
auch langsamer sein.
Das ist mein Tipp – kann aber auch voll daneben liegen. 🙂
Hallo,
ganz klar der ohne Lücken weil wenn man sagt gib mir ab id 15
dann muss Mysql nämlich nicht beim ersten genau 15 Zeilen
weglassen. Beim zweiten muss er rechnen wieviele draussen sind.
cu, Jens