Problém je v tom, že MySQL používá při provádění dotazu pouze jeden index. Pokud přidáte nový index, který používá 3 pole ve vašem WHERE
klauzule, najde řádky rychleji.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
Podle dokumentace MySQL ORDER BY Optimization :
To je to, co se stane ve vašem případě. Jako výstup EXPLAIN
nám říká, že optimalizátor používá klíč price
najít řádky. Nicméně ORDER BY
je v poli date_updated
který nepatří ke klíči price
.
Chcete-li rychleji najít řádky A řadit řádky rychleji, musíte přidat index, který obsahuje všechna pole použitá v WHERE
a v ORDER BY
klauzule:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
Pole použité pro řazení musí být na poslední pozici v indexu. Je zbytečné uvádět price
v indexu, protože podmínka použitá v dotazu vrátí rozsah hodnot.
Pokud EXPLAIN
stále ukazuje, že používá řazení souborů, můžete zkusit donutit MySQL, aby použilo index, který si vyberete:
SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC
LIMIT 19990, 10
Obvykle není nutné index vynucovat, protože správnou volbu nejčastěji provádí optimalizátor MySQL. Ale někdy je to špatná volba nebo ne nejlepší volba. Budete muset provést nějaké testy, abyste zjistili, zda to zlepšuje výkon nebo ne.