Por exemplo, digamos que eu tenha uma tabela:
Business(BusinessID, Lattitude, Longitude)
Todos são indexados, é claro. Também existem 1 milhão de registros
Digamos que eu queira encontrar empresas mais próximas a 106,5, por exemplo, como eu faria isso?
Se eu fizer
SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000
por exemplo, ou se eu fizer
SELECT *
FROM Business
TOP 20
Em teoria, o computador terá que calcular a distância para todos os negócios, enquanto na prática apenas aqueles com latitude e longitude dentro de um determinado intervalo que deve ser calculado.
Então, como posso fazer o que quero em PhP ou SQL, por exemplo?
Sou grato com a resposta até agora. Estou usando o mysql e eles não têm nada mais eficiente do que a solução óbvia. O MySQL espacial também não possui a função de distância computacional.
fonte
(Divulgação: eu sou do tipo Microsoft SQL Server, então minhas respostas são influenciadas por isso.)
Para realmente fazer isso com eficiência, há duas coisas que você deseja: armazenamento em cache e suporte a dados espaciais nativos. O suporte a dados espaciais permite armazenar dados de geografia e geometria diretamente no banco de dados sem fazer cálculos intensos / caros dinamicamente e permite criar índices para encontrar rapidamente o ponto mais próximo da sua localização atual (ou rota mais eficiente ou qualquer outra coisa).
O armazenamento em cache é importante se você deseja dimensionar, período. A consulta mais rápida é aquela que você nunca faz. Sempre que um usuário pede as coisas mais próximas a ele, você armazena sua localização e o conjunto de resultados em um cache como o Redis ou o cache de memórias por um período de horas. As localizações das empresas não serão alteradas por quatro horas - bem, elas podem ocorrer se alguém editar uma empresa, mas você não precisa necessariamente ser atualizado imediatamente em todos os conjuntos de resultados.
fonte
O Yelp provavelmente usa GIS
O PostgreSQL possui a implementação de referência para GIS com PostGIS . O Yelp pode estar usando MySQL, que é inferior em todos os aspectos . No caso de algo como o Yelp, eles quase certamente mantêm as coordenadas para,
Essas coordenadas estão quase certamente no WGS84 e armazenadas como tipo de Geografia. No PostgreSQL e no PostGIS, seria algo como isto,
Eles enchiam a mesa. Eles pegam as coordenadas WGS84 do seu telefone e geram uma consulta, como esta com o SQL Alchemy (no caso do Yelp),
Para obter mais informações, consulte nosso espaço e confira Sistemas de Informação Geográfica @ StackExchange
fonte