Napište dotaz takto:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Neurčujte, jaké indexy se mají použít.
Počínaje WHERE
klauzule, vypadá to takto mohlo být užitečné:INDEX(status)
. Ale protože „stav“ zní jako „vlajka“ s nízkou mohutností, optimalizátor může rozhodnout se ignorovat index a jednoduše provést skenování tabulky. To je v pořádku. Je to v pořádku, protože je rychlejší provádět skenování tabulky než přeskakovat mezi indexem a daty, když index není příliš selektivní. V každém případě nechte rozhodnutí na Optimalizátoru.
Nyní, když se zabývá orders
, musí se JOIN
users
. Jediný způsob, jak toho dosáhnout, je mít index na id
. Tento název ("id") naznačuje, že se může jednat o PRIMARY KEY
, je to tak? (Uveďte prosím SHOW CREATE TABLE
.)
Druhý dotaz, který jste zmínil, by měl být napsán
SELECT * FROM users WHERE id=33
A jak již bylo řečeno, index (PRIMARY KEY
?) na id
je správná věc.
Neexistuje žádná výhoda (pro dané SELECTs
, alespoň) pro INDEX(status, id_user)
. Váš výběr zahrnuje všechny sloupce (*
); bylo to načteno pouze id_user
, pak by byl takový index "krycí" a měl by určitou výhodu.