Геолокация 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', ...);

Это не дало мне заметной разницы в скорости запросов.

У кого-нибудь есть идеи, что мне делать? Мне нужно найти решение, которое позволит сайту лучше масштабироваться.

Ответы на вопрос(1)

Ваш ответ на вопрос