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 .)
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.