4 votos

Cómo acelerar esta sencilla consulta MySQL de puntos en la caja

MySQL no tiene búsqueda del vecino más cercano así que. Así que trato de llegar a una "distancia" que es razonable para que el número de consulta devuelta es de alrededor de 20-200.

De esta forma innodb no tiene que calcular la distancia para unas 30k filas si sólo necesitamos 20. La latitud y la longitud también se almacenan en una tabla myisam llamada tableauxiliary

Pues bien, incluso después de eso, las consultas siguen tardando 13 segundos y a veces 30 segundos.

SELECT TB.ID ,
  TB.Latitude,
  TB.Longitude,
  111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
  `tablebusiness` AS TB
  join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
  MBRContains(
        GeomFromText (
            'MULTIPOINT(-6.1928749092968 106.7651250907,-6.1771250907032 106.7808749093)'
            ),
            TA.Latlong) 
  AND MATCH (TA.FullTextSearch) AGAINST ('re*' IN BOOLEAN MODE) 
AND TA.Prominent >15 
ORDER BY
  Distance

Por cierto, el número de partidos es de 32.

Showing rows 0 - 29 ( 32 total, Query took 16.1845 sec)

Además, una consulta aún más sencilla en la que no se calcula la distancia también tarda 16 segundos

SELECT TB.ID
FROM
  `tablebusiness` AS TB
  join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
  MBRContains(
        GeomFromText (
            'MULTIPOINT(-6.1928749092968 106.7651250907,-6.1771250907032 106.7808749093)'
            ),
            TA.Latlong) 
  AND MATCH (TA.FullTextSearch) AGAINST ('res*' IN BOOLEAN MODE)    
AND TA.Prominent >15 

Puedo entender que mysql no pueda hacer la búsqueda del vecino más cercano. Lo que estoy haciendo ahora es una simple búsqueda de puntos en una caja aquí. ¿Qué me falta?

La explicación de la consulta es:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  TA  fulltext    PRIMARY,Prominent,LatLong,LatLong_2,FullTextSearch  FullTextSearch  0       1   Using where
1   SIMPLE  TB  eq_ref  PRIMARY     PRIMARY     752     gensurv_isikota.TA.BusinessID   1   Using index

Básicamente dice que sólo se computa una fila para cada uno de los procesos.

el número de datos es de 1,6 millones, pero el número de datos en una caja es sólo de 30

2voto

Erik Öjebo Puntos 6937

Puede exportar los datos e importarlos a un MyISAM MYSQL De este modo, tendrá una indexación espacial que acelerará todo el proceso muchas veces. PostGIS sería aún más rápido.

No creo que tus consultas sean erróneas - sólo necesita ser una tabla espacial con índice.

Los tipos de Spatial dependen del software de base de datos utilizado:

Los índices espaciales son utilizados por las bases de datos espaciales (bases de datos que almacenan información relacionada con objetos en el espacio) para optimizar las consultas espaciales. Los índices utilizados por las bases de datos no espaciales no pueden manejar eficazmente características como la distancia que separa dos puntos y si los puntos se encuentran dentro de un área espacial de interés. Los métodos de índices espaciales más comunes son:

Grid (spatial index)
Z-order (curve)
Quadtree
Octree
UB-tree
R-tree: Typically the preferred method for indexing spatial data. Objects (shapes, lines and points) are grouped using the minimum bounding rectangle (MBR). Objects are added to an MBR within the index that will lead to the smallest increase in its size.
R+ tree
R* tree
Hilbert R-tree
X-tree
kd-tree
m-tree - an m-tree index can be used for the efficient resolution of similarity queries on complex objects as compared using an arbitrary metric.

Fuente: http://en.wikipedia.org/wiki/Spatial_database#Spatial_index

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X