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