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

MySQL sind meine Indizes gut?

Schreiben Sie die Abfrage folgendermaßen:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

Geben Sie nicht an, welche Indizes verwendet werden sollen.

Beginnend mit dem WHERE Klausel, so sieht es vielleicht aus nützlich sein:INDEX(status) . Aber da "Status" wie ein "Flag" mit niedriger Kardinalität klingt, kann der Optimierer Entscheiden Sie sich dafür, den Index zu ignorieren und einfach einen Tabellenscan durchzuführen. Das ist in Ordnung. Es ist in Ordnung, weil es schneller ist, einen Tabellenscan durchzuführen, als zwischen einem Index und den Daten zu wechseln, wenn der Index nicht sehr selektiv ist. Überlassen Sie die Entscheidung in jedem Fall dem Optimierer.

Nun, da es sich um orders handelt , es muss JOIN werden an users . Die einzige Möglichkeit, dies zu tun, besteht darin, einen Index für id zu haben . Dieser Name ("id") impliziert, dass es sich um den PRIMARY KEY handeln könnte , ist es? (Bitte geben Sie SHOW CREATE TABLE an .)

Index-Kochbuch

Die andere von Ihnen erwähnte Abfrage sollte geschrieben werden

SELECT * FROM users WHERE id=33

Und, wie bereits besprochen, der Index (PRIMARY KEY ?) auf id ist das Richtige.

Es ergibt sich kein Vorteil (für die gegebenen SELECTs , mindestens) für INDEX(status, id_user) . Ihre Auswahl umfasst alle Spalten (* ); es hatte nur id_user geholt , dann wäre ein solcher Index "deckend" und hätte einige Vorteile.