tipo longitud latitud guardar dato sql mysql database performance sqlperformance

dato - guardar latitud y longitud en sql server



Base de datos/SQL: ¿cómo almacenar datos de longitud/latitud? (9)

Flotador (10,6)

¿Dónde está la latitud o la longitud 5555.123456?

¿No te refieres a Float (9,6) en su lugar?

Pregunta de rendimiento ...

Tengo una base de datos de casas que tienen datos de geolocalización (longitud y latitud).

Lo que quiero hacer es encontrar la mejor manera de almacenar los datos de ubicación en mi MySQL (v5.0.24a) usando el motor de base de datos InnoDB para poder realizar muchas consultas en las que estoy devolviendo todos los registros locales que están entre x1 y x2 latitude e y1 y y2 longitude .

En este momento, mi esquema de base de datos es

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

Y mi consulta es:

SELECT ... WHERE geolat BETWEEN x1 AND x2 AND geolng BETWEEN y1 AND y2

  • ¿Es lo que describí arriba la mejor manera de almacenar los datos de latitud y longitud en MySQL usando Float (10,6) y separando la longitud / latitud? Si no, ¿qué es? Existe Float, Decimal e incluso Spatial como tipo de datos.
  • ¿Es esta la mejor manera de realizar SQL desde el punto de vista del rendimiento? Si no, ¿qué es?
  • ¿Tiene sentido usar un motor de base de datos MySQL diferente?

ACTUALIZACIÓN: aún sin respuesta

Tengo 3 respuestas diferentes a continuación. Una persona dice usar Float . Una persona dice que use INT . Una persona dice usar Spatial .

Así que utilicé la instrucción "EXPLAIN" de MySQL para medir la velocidad de ejecución de SQL. Parece que no existe absolutamente ninguna diferencia en la ejecución de SQL (recuperación del conjunto de resultados) si se usa INT o FLOAT para el tipo de datos de longitud y latitud.

También parece que usar la instrucción " BETWEEN " es SIGNIFICATIVAMENTE más rápido que usar las sentencias SQL " > " o " < ". Es casi 3 veces más rápido usar " BETWEEN " que usar la instrucción " > " y " < ".

Habiendo dicho eso, sigo sin saber cuál será el impacto en el rendimiento si utilizo Spatial ya que no está claro si es compatible con mi versión de MySQL en ejecución (v5.0.24) ... así como también cómo lo habilito si es compatible. .

Cualquier ayuda sería muy apreciada


El problema con el uso de cualquier otro tipo de datos que no sean "espaciales" aquí es que tu tipo de "selección rectangular" puede (por lo general, esto depende de cuán brillante sea tu DBMS, y MySQL ciertamente no es el más brillante) solo se optimiza en uno dimensión única

El sistema puede elegir el índice de longitud o el índice de latitud y usarlo para reducir el conjunto de filas que se deben inspeccionar. Pero una vez hecho esto, existe la opción de: (a) obtener todas las filas encontradas y escanearlas y probar la "otra dimensión", o (b) realizar el proceso similar en la "otra dimensión" y luego haciendo coincidir esos dos conjuntos de resultados para ver qué filas aparecen en ambos. Esta última opción puede no implementarse como tal en su motor DBMS particular.

Los índices espaciales hacen lo último "automáticamente", así que creo que es seguro decir que un índice espacial dará el mejor rendimiento en cualquier caso, pero también puede ser que no supere significativamente a las otras soluciones, y que simplemente no vale la pena la molestia. Esto depende de todo tipo de cosas como el volumen y la distribución en sus datos reales, etc.

Ciertamente, es cierto que los índices de flotación (árbol) son, por necesidad, más lentos que los índices enteros, debido al mayor tiempo que suele tardar en ejecutar ''>'' en los flotantes que en los enteros. Pero me sorprendería si este efecto fuera realmente notable.


Google usa float (10,6) en su ejemplo de "Localizador de tiendas". Eso es suficiente para que yo vaya con eso.

https://.com/a/5994082/1094271

Además, al iniciar MySQL 5.6.x, el soporte de extensiones espaciales es mucho mejor y comparable con PostGIS en funciones y rendimiento.



Lo almacenaría como enteros ( int , 4 bytes) representados en 1 / 1,000,000 grados. Eso le daría una resolución de pocas pulgadas.

No creo que haya ningún tipo de datos espaciales intrínsecos en MySQL.



Sé que estás preguntando por MySQL, pero si los datos espaciales son importantes para tu negocio, es posible que quieras reconsiderarlo. PostgreSQL + PostGIS también son software libre, y tienen una gran reputación para administrar datos espaciales y geográficos de manera eficiente. Mucha gente usa PostgreSQL solo por PostGIS.

Sin embargo, no sé mucho sobre el sistema espacial MySQL, así que quizás funcione lo suficientemente bien para su caso de uso.


Tengo exactamente el mismo esquema (float (10,6)) y query (seleccionando dentro de un rectángulo) y encontré que al cambiar el motor db de innoDB a myisam se duplicaba la velocidad para un "punto en búsqueda de rectángulo" en una tabla con 780,000 registros.

Además, convertí todos los valores lng / lat a números enteros cartesianos (x, y) y creé un índice de dos columnas en x, y y mi velocidad pasó de ~ 27 ms a 1.3 ms para la misma búsqueda.


flotar (10,6) está bien.

Cualquier otro esquema de almacenamiento intrincado requerirá más traducción dentro y fuera, y la matemática de coma flotante es bastante rápida.