Bref,
- Quel devrait être le type de données de latitude et de longitude?
- Quelle commande SQL dois-je appeler pour obtenir les 100 premiers restaurants les plus proches par exemple?
Détail:
J'ai 100k biz record chacun avec lattitude et longitude. Je vois que MySQL supporte en fait un type de données appelé point. Dois-je utiliser cela à la place?
MySQL prend-il en charge le système de stockage KDTree http://en.wikipedia.org/wiki/File:KDTree-animation.gif
Est-il préférable d'utiliser le type de données ponctuelles plutôt que le type de données flottant normal pour stocker la latitutude et la longitude?
Finalement, je veux trouver des choses comme les 100 premiers restaurants les plus proches des points 105,6 par exemple et mes bases de données contiennent beaucoup de biz et de points. Évidemment, calculer la distance un par un pour chaque enregistrement et pour chaque point serait O (n) et donc nul.
Notez que je connais une solution plus simple décrite dans Comment une application comme Yelp Récupère-t-elle efficacement les informations de distance de la base de données et que je les implémenterai moi-même pour commencer. Voilà une bonne réponse.
Cependant, je pense qu'il y a une crème de la réponse de la culture qui devrait surpasser ce droit? En fait, stocker l'emplacement en fonction de la latitude et de la longitude et trouver des objets les plus proches est un problème très courant, je m'attends à ce que mysql ait un modèle de conception spécial pour cela. At-il cela?
Où puis-je en savoir plus à ce sujet? Merci.
Réponses:
En ce qui concerne les modèles de conception, la question Yelp est assez standard.
Pour une réponse plus complexe, vous aurez probablement besoin de la distance géospatiale. Voici un powerpoint fascinant sur ce sujet (et en voici également une version pdf). Cependant, les mathématiques impliquées sont assez laides.
De leur diapositive:
Il y a une réponse plus longue et plus approfondie sur la distance géospatiale sur Stack Overflow .
Mais vous voulez toujours limiter les résultats par la latitude et la longitude.
En fin de compte, j'éviterais le type de données POINT et j'irais avec la latitude / longitude. Il n'y a actuellement aucun moyen de déterminer la distance entre deux POINTS, vous devrez donc de toute façon stocker la latitude / longitude pour ce calcul.
Un dernier lien: vous pouvez également consulter ce fil SO concernant l'accélération des requêtes à l'aide d'index spatiaux.
la source
Les types de données de point sont OK; vous pouvez simplement appeler X (coord) / Y (coord) pour obtenir les valeurs Lat / Lon.
Par exemple:
la source
Trouvez les 100 restaurants les plus proches d'une coordonnée: Voir le code efficace dans http://mysql.rjweb.org/doc.php/latlng Il comprend une fonction stockée pour calculer la distance du "grand cercle".
la source