Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Performantes Sortieren von Schlüsseln in einem MySQL Compound Index (WRT Rails Polymorphic Associations und STI)

Aus meiner eigenen Recherche (aber ich bin kein DBA-Experte) habe ich gelernt, dass bei der Entscheidung über die Reihenfolge eines zusammengesetzten Schlüsselindexes zwei Dinge zu berücksichtigen sind.

Erstens, was die Kardinalität von Spalten betrifft, sind Indizes im Allgemeinen besser darin, Spalten mit hoher Kardinalität zu durchsuchen. Also würde ich dazu neigen, die Spalte mit der höchsten Kardinalität zuerst im Index zu platzieren. Als Referenz gibt es einen Artikel mit dem Titel MySQL-Abfrageoptimierung das sagt:

In Ihrem Fall die _id -Spalten würden eindeutig besser zu dieser Definition passen, daher sind sie ein besserer Kandidat, um ein Präfix des Schlüssels zu sein.

Eine weitere zu berücksichtigende Sache wäre die Wiederverwendbarkeit dieser Indizes. Die meisten (wenn nicht alle) Datenbanksysteme erlauben die Wiederverwendung eines Präfixes eines zusammengesetzten Schlüssels. Zum Beispiel ein zusammengesetzter Schlüssel für (owner_id, owner_type) könnte auch von Abfragen auf owner_id verwendet werden aber nicht auf owner_type .

Nach dem, was Sie in Ihrer Frage erklärt haben, sind Sie mit zwei Indizes möglicherweise besser dran:einem zusammengesetzten Schlüsselindex für (owner_id, owner_type) und ein weiterer auf (owner_type) .

Schließlich kommt es wirklich auf Ihren Datensatz und Ihre Abfragen an. Probieren Sie mehrere Szenarien und Benchmarks mit unterschiedlichen zusammengesetzten Schlüsselreihenfolgen aus, um zu sehen, was die optimalste Lösung ist. Vergessen Sie auch nicht, dass Indizes eine Schreibstrafe für Ihre Tabellen nach sich ziehen.

Aktualisieren :Dort gibt es auch eine andere ziemlich beliebte SO-Frage zum zusammengesetzten Schlüsselindex:

Wann sollte ich einen zusammengesetzten Index verwenden?