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

MySQL:Spalten mit niedriger Kardinalität/Selektivität =wie wird indiziert?

Der Index, den Sie beschreiben, ist ziemlich sinnlos. Ein Index wird am besten verwendet, wenn Sie einen kleinen auswählen müssen Anzahl der Zeilen im Vergleich zu den Gesamtzeilen.

Der Grund dafür hängt damit zusammen, wie eine Datenbank auf eine Tabelle zugreift. Tabellen können entweder durch einen vollständigen Tabellenscan bewertet werden, bei dem jeder Block der Reihe nach gelesen und verarbeitet wird. Oder durch eine Rowid- oder Schlüsselsuche, bei der die Datenbank eine Schlüssel-/Rowid hat und genau die Zeile liest, die sie benötigt.

Für den Fall, dass Sie eine Where-Klausel verwenden, die auf dem Primärschlüssel oder einem anderen eindeutigen Index basiert, z. where id = 1 , kann die Datenbank den Index verwenden, um einen genauen Verweis darauf zu erhalten, wo die Daten der Zeile gespeichert sind. Dies ist deutlich effizienter, als einen vollständigen Tabellenscan durchzuführen und jeden Block zu verarbeiten.

Nun zurück zu Ihrem Beispiel, Sie haben eine where-Klausel von where status = 'enabled' , gibt der Index 150 Millionen Zeilen zurück und die Datenbank muss jede Zeile der Reihe nach mit separaten kleinen Lesevorgängen lesen. Während der Zugriff auf die Tabelle mit einem vollständigen Tabellenscan es der Datenbank ermöglicht, effizientere größere Lesevorgänge zu verwenden.

Es gibt einen Punkt, an dem es besser ist, einfach einen vollständigen Tabellenscan durchzuführen, anstatt den Index zu verwenden. Mit mysql können Sie FORCE INDEX (idx_name) verwenden als Teil Ihrer Abfrage, um Vergleiche zwischen den einzelnen Tabellenzugriffsmethoden zu ermöglichen.

Referenz:http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html