Ripubblicazione di una domanda posta su Stack Overflow quando è stato suggerito che questo sarebbe un forum migliore.
Sto provando un piccolo esperimento a spingere un set di dati che non è geospaziale ma si adatta abbastanza bene e sto trovando i risultati un po 'inquietanti. Il set di dati è costituito da dati genomici, ad esempio il genoma umano, in cui abbiamo una regione di DNA in cui elementi come i geni occupano specifiche coordinate di inizio e fine (il nostro asse X). Abbiamo più regioni di DNA (cromosomi) che occupano l'asse Y. L'obiettivo è riportare tutti gli elementi che intersecano due coordinate X lungo una singola coordinata Y, ad esempio LineString (START 1, END 2).
La teoria sembrava solida, quindi l'ho spinto in un progetto di genoma basato su MySQL esistente e ho inventato una struttura di tabella come:
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
rappresenta l'identificatore dell'entità che abbiamo codificato in questa tabella e external_type
codifica la fonte di ciò. Tutto sembrava a posto e ho inserito alcuni dati preliminari (30.000 righe) che sembravano funzionare bene. Quando questo ha superato i 3 milioni di righe, MySQL ha rifiutato di utilizzare l'indice spaziale ed è stato più lento quando è stato costretto a usarlo (40 secondi contro 5 secondi usando una scansione completa della tabella). Quando sono stati aggiunti più dati, l'indice ha iniziato a essere utilizzato, ma la penalità per le prestazioni persisteva. La disattivazione dell'indice ha portato la query a 8 secondi. La query che sto usando è simile a:
select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
I dati che vanno in questo sono molto densi lungo le dimensioni Y (pensateci come se aveste registrato la posizione di ogni edificio, cabina telefonica, casella postale e piccione su una strada molto lunga). Ho fatto dei test su come si comportano gli R-Indexes con questi dati in Java e altri nel campo li hanno applicati con successo ai formati di file flat. Tuttavia nessuno li ha applicati ai database AFAIK che è l'obiettivo di questo test.
Qualcuno ha visto un comportamento simile quando si aggiungono grandi quantità di dati a un modello spaziale che non è molto disparato lungo un determinato asse? Il problema persiste se invertisco l'utilizzo delle coordinate. Sto eseguendo la seguente configurazione se questa è una causa
- MacOS 10.6.6
- MySQL 5.1.46