Re-publique uma pergunta feita no Stack Overflow quando foi sugerido que este seria um fórum melhor.
Estou tentando um pequeno experimento para empurrar um conjunto de dados que não é geoespacial, mas que se encaixa muito bem e estou achando os resultados um tanto perturbadores. O conjunto de dados é genômico, por exemplo, o genoma humano, onde temos uma região do DNA onde elementos como genes ocupam coordenadas específicas de início e parada (nosso eixo X). Temos várias regiões do DNA (cromossomos) que ocupam o eixo Y. O objetivo é recuperar todos os itens que cruzam duas coordenadas X ao longo de uma única coordenada Y, por exemplo, LineString (START 1, END 2).
A teoria parecia sólida, então eu a coloquei em um projeto de genoma baseado em MySQL existente e criei uma estrutura de tabela 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 o identificador da entidade que codificamos nesta tabela e external_type
codifica a fonte disso. Tudo parecia bom e introduzi alguns dados preliminares (30.000 linhas) que pareciam funcionar bem. Quando isso ultrapassou a marca de 3 milhões de linhas, o MySQL se recusou a usar o índice espacial e ficou mais lento quando foi forçado a usá-lo (40 segundos vs. 5 segundos usando uma varredura de tabela completa). Quando mais dados foram adicionados, o índice começou a ser usado, mas a penalidade de desempenho persistiu. Forçar o desligamento do índice reduziu a consulta para 8 segundos. A consulta que estou usando se parece com:
select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
Os dados que entram nisso são muito densos ao longo das dimensões Y (pense como se você tivesse registrado a posição de cada prédio, caixa telefônica, caixa postal e pombo em uma estrada muito longa). Fiz testes de como o R-Indexes se comporta com esses dados em Java, assim como com outros no campo, os aplicaram a formatos de arquivo simples com êxito. No entanto, ninguém os aplicou aos bancos de dados AFAIK, que é o objetivo deste teste.
Alguém aí viu um comportamento semelhante ao adicionar grandes quantidades de dados a um modelo espacial que não é muito díspar ao longo de um eixo específico? O problema persiste se eu reverter o uso de coordenadas. Estou executando a seguinte configuração, se isso é uma causa
- MacOS 10.6.6
- MySQL 5.1.46