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.