Vuelva a publicar una pregunta que se hizo en Stack Overflow cuando se sugirió que este sería un mejor foro.
Estoy intentando un pequeño experimento para impulsar un conjunto de datos que no es geoespacial pero que se ajusta bastante bien y encuentro los resultados algo inquietantes. El conjunto de datos son datos genómicos, por ejemplo, el Genoma Humano, donde tenemos una región de ADN donde elementos como los genes ocupan coordenadas específicas de inicio y parada (nuestro eje X). Tenemos múltiples regiones de ADN (cromosomas) que ocupan el eje Y. El objetivo es recuperar todos los elementos que intersecan dos coordenadas X a lo largo de una sola coordenada Y, por ejemplo, LineString (START 1, END 2).
La teoría parecía sólida, así que la introduje en un proyecto genómico basado en MySQL existente y se me ocurrió una estructura de tabla como:
CREATE TABLE `spatial_feature` (
`spatial_feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`external_id` int(10) unsigned NOT NULL,
`external_type` int(3) unsigned NOT NULL,
`location` geometry NOT NULL,
PRIMARY KEY (`spatial_feature_id`),
SPATIAL KEY `sf_location_idx` (`location`)
) ENGINE=MyISAM;
external_id
representa el identificador de la entidad que hemos codificado en esta tabla y external_type
codifica la fuente de esta. Todo se veía bien e introduje algunos datos preliminares (30,000 filas) que parecían funcionar bien. Cuando esto aumentó más allá de la marca de 3 millones de filas, MySQL se negó a usar el índice espacial y fue más lento cuando se vio obligado a usarlo (40 segundos frente a 5 segundos usando un escaneo de tabla completo). Cuando se agregaron más datos, el índice comenzó a usarse, pero la penalización de rendimiento persistió. Al forzar el índice, la consulta se redujo a 8 segundos. La consulta que estoy usando se ve así:
select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
Los datos que entran en esto son muy densos a lo largo de las dimensiones Y (piense en ello como si hubiera registrado la posición de cada edificio, cabina telefónica, buzón y paloma en un camino muy largo). He realizado pruebas de cómo se comportan los índices R con estos datos en Java, así como otros en el campo los han aplicado con éxito a formatos de archivo plano. Sin embargo, nadie los ha aplicado a las bases de datos AFAIK, que es el objetivo de esta prueba.
¿Alguien ha visto un comportamiento similar al agregar grandes cantidades de datos a un modelo espacial que no es muy disparejo a lo largo de un eje en particular? El problema persiste si revierto el uso de coordenadas. Estoy ejecutando la siguiente configuración si eso es una causa
- MacOS 10.6.6
- MySQL 5.1.46