Geolocation MySQL-Abfrage

Ich betreibe ein auf Geolocation basierendes soziales Netzwerk. Mitglieder können andere Mitglieder basierend auf ihrer Nähe sehen.

Im Moment sieht meine MySQL-Abfrage so aus:

$lat_min = $geo['user_lat'] - 5;
$lat_max = $geo['user_lat'] + 5;
$long_min = $geo['user_long'] - 5;
$long_max = $geo['user_long'] + 5;    

$members_query = "SELECT " . $fields . " FROM members WHERE (user_lat BETWEEN " . $lat_min . " AND " . $lat_max . " AND user_long BETWEEN " . $long_min . " AND " . $long_max . ") OR (gc_lat BETWEEN " . $lat_min . " AND " . $lat_max . " AND gc_long BETWEEN " . $long_min . " AND " . $long_max . ")";

user_lat unduser_long sind Koordinaten basierend auf der Geolokalisierung, wenn sie in ihrem Browser aktiviert sind.gc_lat undgc_long und Koordinaten basierend auf ihrer IP-Adresse. Diese Zeilen sind alle in der Datenbank indiziert. Ich ziehe alle Mitglieder innerhalb von 10 Grad.

Das Problem ist, dass diese Abfrage für mehr als 250.000 Mitglieder ungefähr 2 Sekunden dauert und die Site skaliert werden soll.

Versuch 2: Ich habe versucht, jedem Mitglied Quadranten zuzuweisen, z. "36x-99" ... Ich runde den Breiten- und Längengrad auf das nächste Vielfache von 3 ab, um den Quadranten zu kennzeichnen, und ziehe dann nur Quadranten innerhalb von 12 Grad des Quadranten, in dem sich das Mitglied befindet.

$members_query = "SELECT " . $fields . " FROM members WHERE quadrant IN ('36x-99', '33x-99', '30x-99', ...);

Dies gab mir keinen merklichen Unterschied in der Abfragegeschwindigkeit.

Hat jemand eine Idee, was ich tun soll? Ich muss eine Lösung finden, mit der die Website besser skaliert werden kann.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage