Napisz zapytanie w ten sposób:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Nie określaj, jakich indeksów użyć.
Zaczynając od WHERE
klauzula, wygląda na to, że może być przydatne:INDEX(status)
. Ale ponieważ „stan” brzmi jak „flaga” o niskiej kardynalności, optymalizator może zignoruj indeks i po prostu wykonaj skanowanie tabeli. W porządku. Jest OK, ponieważ szybciej jest wykonać skanowanie tabeli niż przeskakiwać między indeksem a danymi, gdy indeks nie jest zbyt selektywny. W każdym razie pozostaw decyzję Optymalizatorowi.
Teraz, gdy zajmuje się orders
, musi JOIN
do users
. Jedynym sposobem, aby to zrobić, jest posiadanie indeksu na id
. Ta nazwa ("id") sugeruje, że może to być PRIMARY KEY
, prawda? (Proszę podać SHOW CREATE TABLE
.)
Inne zapytanie, o którym wspomniałeś, powinno zostać napisane
SELECT * FROM users WHERE id=33
I, jak już wspomniano, indeks (PRIMARY KEY
?) na id
jest właściwą rzeczą.
Nie ma przewagi (dla podanych SELECTs
, przynajmniej) dla INDEX(status, id_user)
. Twój wybór obejmuje wszystkie kolumny (*
); pobrał tylko id_user
, wtedy taki indeks byłby „pokrywający” i miałby pewną przewagę.