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.