Não é uma resposta específica do MySql, mas melhorará o desempenho da sua instrução sql.
O que você está efetivamente fazendo é calcular a distância de cada ponto da tabela, para ver se está dentro de 10 unidades de um determinado ponto.
O que você pode fazer antes de executar este sql é criar quatro pontos que desenham uma caixa de 20 unidades de um lado, com o seu ponto no centro, ou seja. (x1, y1). . . (x4, y4), onde (x1, y1) é (dado + 10 unidades, dado + Lat + 10 unidades). . . (determinadoLongo - 10 unidades, dadoLat -10 unidades).
Na verdade, você só precisa de dois pontos, superior esquerdo e inferior direito, chame-os (X1, Y1) e (X2, Y2)
Agora, sua instrução SQL usa esses pontos para excluir linhas que definitivamente são mais de 10u do seu ponto especificado, ela pode usar índices nas latitudes e longitudes, portanto haverá ordens de magnitude mais rápidas do que as que você possui atualmente.
por exemplo
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
A abordagem da caixa pode retornar falsos positivos (você pode pegar pontos nos cantos da caixa que são> 10u a partir do ponto especificado), portanto, você ainda precisa calcular a distância de cada ponto. No entanto, isso novamente será muito mais rápido, porque você limitou drasticamente o número de pontos a serem testados nos pontos dentro da caixa.
Eu chamo essa técnica de "Pensar dentro da caixa" :)
Edição: isso pode ser colocado em uma instrução SQL?
Não tenho idéia do que o mySql ou Php é capaz, desculpe. Eu não sei onde o melhor lugar é construir os quatro pontos, ou como eles podem ser passados para uma consulta mySql em Php. No entanto, depois de ter os quatro pontos, não há nada que o impeça de combinar sua própria instrução SQL com a minha.
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
Eu sei que com o MS SQL eu posso criar uma instrução SQL que declara quatro carros alegóricos (X1, Y1, X2, Y2) e os calcula antes da instrução de seleção "principal", como eu disse, não tenho idéia se isso pode ser feito com MySql. No entanto, eu ainda estaria inclinado a criar os quatro pontos em C # e passá-los como parâmetros para a consulta SQL.
Desculpe, não posso ajudar mais, se alguém puder responder a partes específicas do MySQL e Php, sinta-se à vontade para editar essa resposta.