Skriv forespørgslen på denne måde:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Angiv ikke, hvilke indekser der skal bruges.
Startende med WHERE
klausul, ser det ud til, at dette kan være nyttig:INDEX(status)
. Men da "status" lyder som et "flag" med lav kardinalitet, kan optimeringsværktøjet må beslutte at ignorere indekset og blot lave en tabelscanning. Det er i orden. Det er OK, fordi det er hurtigere at lave en tabelscanning end at hoppe mellem et indeks og dataene, når indekset ikke er særlig selektivt. Under alle omstændigheder skal du lade beslutningen være op til Optimizer.
Nu hvor det beskæftiger sig med orders
, den skal JOIN
til users
. Den eneste måde at gøre det på er at have et indeks på id
. Dette navn ("id") antyder, at det kan være den PRIMARY KEY
, er det? (Angiv venligst SHOW CREATE TABLE
.)
Den anden forespørgsel, du nævnte, skal skrives
SELECT * FROM users WHERE id=33
Og, som allerede diskuteret, indekset (PRIMARY KEY
?) på id
er det rigtige.
Der er ingen fordel (for de givne SELECTs
). , mindst) for INDEX(status, id_user)
. Dit valg inkluderer alle kolonner (*
); det havde kun hentet id_user
, så ville et sådant indeks være "dækkende" og have en vis fordel.