Base de données/SQL: Comment stocker de la longitude/latitude de données?

Performance question ...

J'ai une base de données de maisons qui ont des données de géolocalisation (longitude et latitude).

Ce que je veux faire est de trouver la meilleure façon de stocker la localisation des données dans ma base de données MySQL (v5.0.24 a) à l'aide de InnoDB moteur de base de données afin que je puisse effectuer un grand nombre de requêtes, lorsque je suis retourner tous les enregistrements qui sont entre x1 et x2 latitude et y1 et y2 longitude.

Pour l'instant, mon schéma de base de données est

---------------------
Homes   
---------------------
geolat - Float (10,6)
geolng - Float (10,6)
---------------------

Et ma question est:

SELECT ... 
WHERE geolat BETWEEN x1 AND x2
AND geolng BETWEEN y1 AND y2
  • Est ce que j'ai décrit ci-dessus, la meilleure façon de stocker l'
    de latitude et de longitude données MySQL à l'aide du Flotteur (10,6) et en séparant la longitude/latitude? Si non, qu'est-ce que? Il existe des Float, Décimal et même Spatiale comme un type de données.
  • Est-ce la meilleure façon d'effectuer la
    SQL à partir d'un point de vue des performances? Si non, qu'est-ce que?
  • Ne l'aide d'un autre MySQL
    moteur de base de données de sens?

Mise à JOUR: Toujours sans Réponse

J'ai 3 différentes réponses ci-dessous. Une personne dire à utiliser Float. Une personne dit d'utiliser INT. Une personne dit d'utiliser Spatial.

J'ai donc utilisé MySQL "EXPLIQUER" déclaration de mesurer le SQL de la vitesse d'exécution. Il semble que absolument aucune différence dans l'exécution SQL (ensemble de résultats de l'extraction) existe si l'aide INT ou FLOAT pour la latitude et la longitude type de données..

Il apparaît également que l'aide de la "BETWEEN" instruction est NETTEMENT plus rapide que d'utiliser le ">" ou "<" SQL. C'est presque 3x plus rapide à utiliser "BETWEEN" plutôt que d'utiliser le ">" et "<" instruction.

Avec cela étant dit, je suis encore unceratin sur ce que l'impact sur les performances seraient si l'espace puisque c'est pas clair pour moi si c'est pris en charge avec ma version de MySQL en cours d'exécution (v5.0.24) ... ainsi que la façon dont je l'activer si la prise en charge.

Toute aide serait grandement appreacited

  • Utiliser FLOAT si le degré est le format pour votre application de sorte que vous n'avez pas à convertir. Microdegrees stockées en tant que INT vous donne plus de précision. Vous ne pouvez pas battre ces deux spectacles. Considérer seulement spatiale des extensions si l'index spatial est nécessaire.
  • Codeur, je n'ai pas l'esprit de la conversion - je suis simplement à la recherche pour trouver ce type de données basé sur mon cas d'utilisation ci-dessus serait de retour le plus rapide SQL ensemble résultat. Aussi, est de savoir comment j'ai écrit mon SQL plus efficace?
  • Tant que vous avez des indices sur lat-lon, votre requête doit être rapide. Nous sommes allés avec INT parce que notre DBA nous a dit l'index sur le flotteur est lent, mais je n'ai jamais essayé moi-même donc aucune idée de comment lent, il est. Vous pouvez également obtenir une sélection circulaire assez rapidement en utilisant @geodist() sur la vue retournée par cette requête.
  • Même question avec réponse: stackoverflow.com/questions/159255/...