Consulta MySQL de geolocalização

Eu administro uma rede social baseada em geolocalização. Os membros podem ver outros membros com base em sua proximidade.

No momento, minha consulta MySQL se parece com:

$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 euser_long são coordenadas com base na localização geográfica, caso estejam ativadas no navegador.gc_lat egc_long e coordenadas com base em seus endereços IP. Essas linhas são todas indexadas no banco de dados. Estou puxando todos os membros em 10 graus.

O problema é que essa consulta leva cerca de 2 segundos para ser executada para mais de 250.000 membros e queremos que o site seja dimensionado.

Tentativa 2: Tentei atribuir quadrantes a cada membro, por exemplo "36x-99" ... Estou arredondando a latitude e a longitude para o múltiplo mais próximo de 3 para rotular o quadrante e, em seguida, só puxo quadrantes dentro de 12 graus do quadrante em que o membro está.

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

Isso não me deu nenhuma diferença perceptível na velocidade da consulta.

Alguém tem alguma idéia do que devo fazer? Preciso encontrar uma solução que permita que o site seja melhor dimensionado.

questionAnswers(1)

yourAnswerToTheQuestion