MYSQL Geo Search mit Entfernungsleistung

Ich habe eine mysql select-Anweisung für eine Suche auf meiner Website, bei der Leistungsprobleme auftreten, wenn die Website sehr ausgelastet ist. Die folgende Abfrage sucht nach Anzeigen aus einer Tabelle mit über 100.000 Einträgen innerhalb von 40 Kilometern des angegebenen Breiten- und Längengrads und sortiert nach Entfernung. Die Anzahl der Meilen kann je nach Auswahl des Benutzers unterschiedlich sein.

Das Problem ist, dass ich denke, dass es langsam ist, weil es die Berechnungen für alle Datensätze in der Tabelle ausführt und nicht für diejenigen, die sich innerhalb von 25 Meilen von Lat und Lon befinden. Ist es möglich, diese Abfrage so zu ändern, dass die where-Klausel nur Anzeigen innerhalb von 40 Kilometern auswählt? Ich habe über Bounding Box's und räumliche Indizes gelesen, bin mir aber nicht sicher, wie ich sie auf diese Abfrage anwenden soll. Muss ich eine where-Klausel hinzufügen, die Datensätze mit einem Radius von 25 Meilen von Lat und Lon auswählt? Wie mache ich das?

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

Bearbeiten: Aktualisiert, um das Tabellenschema einzuschließen. Bitte beachten Sie, dass die Tabelle und die Abfrage komplizierter sind, aber ich habe die Dinge entfernt, die für dieses Problem nicht erforderlich sind.

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

Wenn ich die mysql-Anweisung erkläre, wird die Anzahl der Zeilen auf 67900 gesetzt, was viel mehr ist als in einem Radius von 40 Kilometern. Außerdem wird das Extra auf "Using where; Using filesort" gesetzt.

Die Abfrage dauert 0,3 Sekunden, was sehr langsam ist, insbesondere wenn die Websites viele Anfragen pro Sekunde erhalten.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage