MYSQL Geo Search o wydajności na odległość

Mam instrukcję mysql select do wyszukiwania na mojej stronie, która ma problemy z wydajnością, gdy witryna jest bardzo zajęta. Poniższe zapytanie wyszukuje reklamy z tabeli z ponad 100 tys. Rekordów, w promieniu 25 mil od podanej liczby lat i lonów i sortuje według odległości. Liczba mil może się różnić w zależności od wyboru użytkownika.

Problem polega na tym, że uważam, że jest powolny, ponieważ wykonuje obliczenia dla wszystkich rekordów w tabeli, a nie dla tych, które znajdują się w odległości 25 mil od lat i lon. Czy można zmienić to zapytanie, aby tam, gdzie klauzula wybierała tylko reklamy w promieniu 25 mil? Czytałem o ograniczających i przestrzennych indeksach, ale nie jestem pewien, jak je zastosować do tego zapytania, czy muszę dodać klauzulę where, która wybiera rekordy o promieniu 25 mil od lat i lon, jak to zrobić?

SELECT 
    adverts.*, 
    round(sqrt((((adverts.latitude - '53.410778') * (adverts.latitude - '53.410778')) * 69.1 * 69.1) + ((adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53)), 1) as distance
FROM 
    adverts
WHERE 
    (adverts.type_id = '3')
HAVING 
    DISTANCE < 25
ORDER BY 
    distance ASC 
LIMIT 120,10

Edycja: Zaktualizowano, aby uwzględnić schemat tabeli. Należy pamiętać, że tabela jest bardziej skomplikowana, podobnie jak zapytanie, ale usunąłem rzeczy, które nie są konieczne dla tego problemu.

CREATE TABLE `adverts` (
`advert_id` int(10) NOT NULL AUTO_INCREMENT,
`type_id` tinyint(1) NOT NULL,
`headline` varchar(50) NOT NULL,
`description` text NOT NULL,
`price` int(4) NOT NULL,
`postcode` varchar(7) NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
PRIMARY KEY (`advert_id`),
KEY `latlon` (`latitude`,`longitude`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

kiedy robię wyjaśnienie w instrukcji mysql, liczba wierszy jest ustawiona na 67900, co jest o wiele więcej niż w promieniu 25 mil, także extra jest ustawione na „Using where; Using filesort”.

Zapytanie trwa 0,3 sekundy, co jest naprawdę powolne, zwłaszcza gdy strony otrzymują wiele żądań na sekundę.

questionAnswers(2)

yourAnswerToTheQuestion