Então, resumindo,
- Qual deve ser o tipo de dados de latitude e longitude?
- Qual comando SQL devo chamar para obter os primeiros 100 restaurantes mais próximos, por exemplo?
Detalhe:
Tenho 100k biz gravar cada um com latitude e longitude. Vejo que o MySQL realmente suporta um tipo de dados chamado point. Devo usar isso em vez disso?
O MySQL suporta o sistema de armazenamento KDTree http://en.wikipedia.org/wiki/File:KDTree-animation.gif
É melhor usar o tipo de dados de ponto em vez do tipo de dados flutuante regular para armazenar latitutude e longitude?
Eventualmente, quero encontrar coisas como os 100 primeiros restaurantes mais próximos dos pontos 105,6, por exemplo, e meus bancos de dados contêm muitos negócios e pontos. Obviamente, calcular a distância uma a uma para todos os registros e para todos os pontos seria O (n) e, portanto, é uma merda.
Observe que estou ciente de uma solução mais simples descrita em Como aplicativos como o Yelp recupera informações de distância do banco de dados de forma eficiente e implementará isso também para começar. Essa é uma boa resposta.
No entanto, acho que há um creme da resposta da colheita que deve superar esse certo? De fato, armazenar localizações com base em latitude e longitude e encontrar objetos mais próximos é um problema muito comum, espero que o mysql tenha um padrão de design especial para isso. Isso tem?
Onde posso aprender mais sobre isso? Obrigado.
Respostas:
Quanto aos padrões de design, a pergunta do Yelp é bastante comum.
Para uma resposta mais complexa, você provavelmente precisará da distância geoespacial. Aqui está um ponto de vista fascinante sobre esse tópico (e aqui também uma versão em pdf). No entanto, a matemática envolvida é bastante feia.
No slide:
Há uma resposta mais longa e aprofundada sobre a distância geoespacial no Stack Overflow .
Mas você ainda deseja limitar os resultados por latitude e longitude.
Por fim, evitaria o tipo de dados POINT e seguia com latitude / longitude. No momento, não há como determinar a distância entre dois pontos, então você precisará armazenar a latitude / longitude para esse cálculo de qualquer maneira.
Um último link: você também pode verificar este segmento de SO referente à aceleração das consultas usando índices espaciais.
fonte
Os tipos de dados de ponto estão OK; você pode simplesmente chamar X (coord) / Y (coord) para obter os valores de Lat / Lon.
Por exemplo:
fonte
Encontre os 100 restaurantes mais próximos de alguma coordenada: Veja código eficiente em http://mysql.rjweb.org/doc.php/latlng Ele inclui uma função armazenada para calcular a distância "grande círculo".
fonte