Schrijf de vraag op deze manier:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Geef niet op welke indexen moeten worden gebruikt.
Beginnend met de WHERE
clausule, ziet het er zo uit misschien handig zijn:INDEX(status)
. Maar aangezien "status" klinkt als een "vlag" met een lage kardinaliteit, kan de optimizer mogelijk besluit de index te negeren en gewoon een tabelscan uit te voeren. Dit is oké. Het is OK omdat het sneller is om een tabelscan uit te voeren dan tussen een index en de gegevens te stuiteren, wanneer de index niet erg selectief is. Laat de beslissing in ieder geval over aan de Optimizer.
Nu het te maken heeft met orders
, het moet JOIN
aan users
. De enige manier om dat te doen is door een index te hebben op id
. Die naam ("id") impliceert dat het de PRIMARY KEY
. kan zijn , is het? (Gelieve SHOW CREATE TABLE
op te geven .)
De andere vraag die u noemde, moet worden geschreven
SELECT * FROM users WHERE id=33
En, zoals reeds besproken, de index (PRIMARY KEY
?) op id
is het juiste ding.
Er is geen voordeel (voor de gegeven SELECTs
, tenminste) voor INDEX(status, id_user)
. Uw selectie bevat alle kolommen (*
); het had alleen id_user
. opgehaald , dan zou zo'n index "dekkend" zijn en enig voordeel hebben.