Wenn ein Index alles langsamer macht
Die Tabelle mit den Tageszahlen hat einen Schlüssel: Zähler und Datum zusammen. Fünf Stellen im Code stellen ihr eine andere Frage — nicht „dieser Zähler über die Zeit", sondern „alle Zähler an diesen Tagen". Die Galerie auf der Startseite, die Topliste, die Sitemap, ein 90-Tage-Diagramm und die Statuszahlen. Ohne Index auf der Datumsspalte liest jede davon alle 114.113 Zeilen.
Dieser Index macht die Galerie zehnmal schneller. Er wurde nicht angelegt. Hier ist die Messung, die das entschieden hat.
Eine Abfrage wurde viel schneller
Die Galerie fragt nach den Zählern, die heute Zugriffe hatten. Ohne Index auf dem Datum läuft sie durch die ganze Tabelle; mit Index schlägt sie ein einziges Datum nach und liest 443 Zeilen. Aus 61,5 Millisekunden wurden 6,1. Das ist kein feiner Unterschied, und wäre es das Einzige gewesen, was gemessen wurde, stünde der Index jetzt in der Datenbank.
Zwei Abfragen wurden langsamer
Die Sitemap fragt nach vierzehn Tagen und wurde 19 % langsamer. Die Statuszahlen fragen nach einem Jahr und wurden 10 % langsamer. In beiden Fällen wechselte der Abfrageplaner vom Primärschlüssel auf den neuen Index und traf damit die schlechtere Wahl.
Das ist der Teil, den man verstehen sollte, denn es ist kein Fehler im Planer. Einen Bereich über einen Sekundärindex zu lesen heißt: die passenden Zeilen im Index finden und jede einzelne davon aus der Tabelle holen. Für einen schmalen Ausschnitt ist das ein Schnäppchen. Für vierzehn Tage aus dreizehn Monaten sind es immer noch viele Zeilen, einzeln geholt, und ein glatter Durchlauf durch die Tabelle — in physischer Reihenfolge gelesen, was Platten und Zwischenspeicher mögen — schlägt das. Der Planer weiß das nicht. Er sieht einen Bereich und einen Index und nimmt ihn.
Man kann nicht sagen „benutze diesen Index nur für die Galerie". Ein Index steht jeder Abfrage offen, die die Spalte anfasst, und der Planer nimmt ihn überall dort, wo seine Schätzungen es nahelegen. Einen anzulegen ist eine Änderung an jeder Abfrage auf dieser Tabelle, nicht an der einen, die man im Sinn hatte.
Zusammen: nichts
Über alle fünf hinweg wurden aus 555 Millisekunden 524. Das ist eine Verbesserung um das 1,1-Fache, und die ist auf einem Raspberry Pi, der diese Seiten ohnehin aus einem Zwischenspeicher ausliefert, keine Schemaänderung wert.
Das 90-Tage-Diagramm sieht nach 9 % Verbesserung aus. Sie wird nicht gezählt, und es lohnt sich zu sagen, warum. Jede Abfrage wurde dreimal gemessen: ohne den Index, mit ihm, dann wieder ohne. Landet der zweite Lauf ohne Index nicht in der Nähe des ersten, war der Unterschied die Maschine und nicht die Änderung. Beim 90-Tage-Diagramm unterschieden sich die beiden Läufe ohne Index um 13,8 % — mehr als der Effekt, der behauptet würde. Diese Zeile misst also nichts, und sie wird als nichts berichtet.
Wie gemessen wurde, und warum das zählt
Nicht an der laufenden Tabelle. Das Skript legt eine Kopie an, arbeitet auf der Kopie und wirft sie am Ende weg. Einen Index an einer Produktionstabelle anzulegen, um zu sehen, was passiert, ist etwas, das man je Überraschung nur einmal tun kann.
Die Abfragen sind die echten, aus dem Code übernommen, samt dem Verbund auf die Zählertabelle. Eine frühere Fassung dieses Tests benutzte einen vereinfachten Ersatz und lieferte eine viel aufregendere Antwort: zwanzigmal schneller. Diese vereinfachte Abfrage stellt niemand.
Welche Zahl herausgekommen wäre
Hätte man das auf die gewöhnliche Art gemessen — die Abfrage nehmen, die sich langsam anfühlt, vorher und nachher stoppen — wäre die Antwort „zehnmal schneller, rein damit" gewesen. Der Index wäre eingebaut worden, die Galerie schneller, Sitemap und Statusseite langsamer, und niemand hätte beides verbunden, weil niemand auf die beiden geschaut hätte.
Das ist die allgemeine Form. Eine Änderung an gemeinsam genutzter Technik lässt sich nicht an dem Fall bewerten, der sie ausgelöst hat. Die Frage ist nicht „hilft das dem, worauf ich gerade sehe", sondern „was fasst das sonst noch an, und was wird daraus".
Es gibt eine Fassung, die funktionieren könnte: ein Index, der beide Spalten trägt, das Datum zuerst, sodass die Galerie allein aus dem Index beantwortet werden kann, ohne in die Tabelle zurückzugehen. Vielleicht verführt er den Planer auf den weiteren Bereichen auch nicht. Das ist nicht gemessen, also ist es keine Empfehlung — es ist das Nächste, was auf die Kopie kommt.