Problem polega na tym, że MySQL używa tylko jednego indeksu podczas wykonywania zapytania. Jeśli dodasz nowy indeks, który używa 3 pól z Twojego WHERE
klauzula, szybciej znajdzie wiersze.
ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
Zgodnie z dokumentacją MySQL ORDER BY Optymalizacja :
Tak dzieje się w twoim przypadku. Jako wynik EXPLAIN
mówi nam, że optymalizator używa klucza price
znaleźć wiersze. Jednak ORDER BY
znajduje się w polu date_updated
który nie należy do klucza price
.
Aby szybciej znaleźć wiersze ORAZ szybciej je posortować, musisz dodać indeks, który zawiera wszystkie pola użyte w WHERE
oraz w ORDER BY
klauzule:
ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
Pole używane do sortowania musi znajdować się na ostatniej pozycji w indeksie. Nie ma sensu dołączać price
w indeksie, ponieważ warunek użyty w zapytaniu zwróci zakres wartości.
Jeśli EXPLAIN
nadal pokazuje, że używa sortowania plików, możesz spróbować zmusić MySQL do użycia wybranego indeksu:
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
Zwykle nie jest konieczne wymuszanie indeksu, ponieważ optymalizator MySQL najczęściej dokonuje właściwego wyboru. Ale czasami to zły lub nie najlepszy wybór. Będziesz musiał przeprowadzić kilka testów, aby sprawdzić, czy poprawia to wydajność, czy nie.