Проблемът е, че MySQL използва само един индекс при изпълнение на заявката. Ако добавите нов индекс, който използва 3-те полета във вашия WHERE
клауза, ще намери редовете по-бързо.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
Съгласно документацията на MySQL ORDER BY Optimization :
Това се случва във вашия случай. Като изход на EXPLAIN
ни казва, че оптимизаторът използва ключа price
за да намерите редовете. Въпреки това, ORDER BY
е в полето date_updated
който не принадлежи на ключа price
.
За да намерите редовете по-бързо И да сортирате редовете по-бързо, трябва да добавите индекс, който съдържа всички полета, използвани в WHERE
и в ORDER BY
клаузи:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
Полето, използвано за сортиране, трябва да бъде на последната позиция в индекса. Безполезно е да включвате price
в индекса, тъй като условието, използвано в заявката, ще върне диапазон от стойности.
Ако EXPLAIN
все още показва, че използва сортиране на файлове, можете да опитате да принудите MySQL да използва индекс, който изберете:
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
Обикновено не е необходимо да се форсира индекс, тъй като MySQL оптимизаторът най-често прави правилния избор. Но понякога прави лош избор или не е най-добрият избор. Ще трябва да изпълните някои тестове, за да видите дали подобрява производителността или не.