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