Use Cases
    Fähigkeiten
    Rollen

Eine Lektion in MySql-Indexierung

Optmyzr

Manas Garg

Manas Garg

LinkedIn

Co-founder

-
Optmyzr

Wir haben also diese Tabelle mit über 20 Millionen Datenzeilen, die Statistiken speichert. Die allgemeine Struktur der Tabelle sieht so aus:

ItemId (varchar) | GroupID (varchar) | Stat1 (float) | Stat2 (float) | … StatN

Es gibt einen Index auf ItemId + GroupId. Bei der Abfrage habe ich festgestellt, dass sie sehr, sehr lange dauern – bis zu 100 Sekunden. Die Abfragen waren einfach und sahen so aus:

SELECT * FROM TABLE WHERE ItemId=123456789 AND GroupId=987654321

Nach verschiedenen Partitionierungen und Abfragestilen hatte ich fast beschlossen, den Server zu upgraden (es war schließlich eine Mikroinstanz auf Amazon EC2, und die CPU stieg an, wenn die Abfrage ausgeführt wurde).

Dann kam mir die Erleuchtung. Ich änderte die Abfrage zu dieser, und die Abfragezeiten sanken auf 0,2 Sekunden!

SELECT * FROM TABLE WHERE ItemId=’123456789’ AND GroupId=’987654321’

Verstanden? Die Spalten sind varchar, aber die Parameter, die ich übergab, waren ints, was eine manuelle Typumwandlung jedes Wertes (über 40 Millionen Werte) und dann eine nicht indizierte Suche verursachte. Kein Wunder, dass es so langsam war.

Einer dieser Tage 🙂 Obwohl ich denke, dass die Abfrage-Optmyzr wahrscheinlich versuchen sollte, den Parameter zu typisieren, anstatt die Tabellenspalten.

Teilen Sie dies auf: