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.
He encontrado útil esta respuesta, ¿quizás también pueda ayudarlo ?: Problema al almacenar los valores de latitud y longitud en la base de datos MySQL
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.
Realmente depende de cómo uses los datos. Pero en una excesiva simplificación de los hechos, el decimal es más rápido pero menos preciso en las aproximaciones. Más información aquí:
http://msdn.microsoft.com/en-us/library/aa223970(SQL.80).aspx
Además, el estándar para coordenadas de GPS se especifica en ISO 6709:
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.