Геолокация MySQL Query
Я управляю социальной сетью на основе геолокации. Участники могут видеть других участников в зависимости от того, насколько они близки.
Прямо сейчас мой запрос MySQL выглядит так:
$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
а такжеuser_long
координаты, основанные на геолокации, если они включены в их браузере.gc_lat
а такжеgc_long
и координаты на основе их IP-адреса. Все эти строки проиндексированы в базе данных. Я тяну всех участников в пределах 10 градусов.
Проблема в том, что этот запрос занимает около 2 секунд для наших 250 000+ участников, и мы хотим, чтобы сайт масштабировался.
ПОПЫТКА 2: Я пытался назначить квадранты каждому члену, например, "36x-99" ... Я округляю широту и долготу до ближайшего значения, кратного 3, чтобы обозначить квадрант, а затем я вытягиваю только квадранты в пределах 12 градусов от квадранта, в котором находится участник.
$members_query = "SELECT " . $fields . " FROM members WHERE quadrant IN ('36x-99', '33x-99', '30x-99', ...);
Это не дало мне заметной разницы в скорости запросов.
У кого-нибудь есть идеи, что мне делать? Мне нужно найти решение, которое позволит сайту лучше масштабироваться.