Erneutes Posten einer Frage zu Stack Overflow, wenn vorgeschlagen wurde, dass dies ein besseres Forum wäre.
Ich versuche ein kleines Experiment, um einen Datensatz zu verschieben, der nicht georäumlich ist, aber recht gut dazu passt, und finde die Ergebnisse etwas beunruhigend. Der Datensatz besteht aus genomischen Daten, z. B. dem menschlichen Genom, in dem sich eine DNA-Region befindet, in der Elemente wie Gene bestimmte Start- und Stoppkoordinaten (unsere X-Achse) einnehmen. Wir haben mehrere DNA-Regionen (Chromosomen), die die Y-Achse einnehmen. Das Ziel ist es, alle Elemente, die zwei X-Koordinaten entlang einer einzigen Y-Koordinate schneiden, zurückzubringen, z. B. LineString (START 1, END 2).
Die Theorie schien solide zu sein, also habe ich sie in ein bestehendes MySQL-basiertes Genomprojekt verschoben und eine Tabellenstruktur wie:
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
Stellt den Bezeichner der Entität dar, die wir in diese Tabelle external_type
codiert haben und codiert die Quelle davon. Alles sah gut aus und ich gab einige vorläufige Daten (30.000 Zeilen) ein, die gut zu funktionieren schienen. Als dies über die 3-Millionen-Zeilen-Marke hinausging, lehnte MySQL die Verwendung des räumlichen Index ab und war langsamer, als er dazu gezwungen wurde (40 Sekunden gegenüber 5 Sekunden bei einem vollständigen Tabellenscan). Wenn weitere Daten hinzugefügt wurden, wurde der Index verwendet, aber die Leistungseinbußen blieben bestehen. Durch das Erzwingen des Indexes wurde die Abfrage auf 8 Sekunden reduziert. Die Abfrage, die ich verwende, sieht folgendermaßen aus:
select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
Die darin enthaltenen Daten sind entlang der Y-Dimension sehr dicht (denken Sie daran, dass Sie die Position jedes Gebäudes, jeder Telefonzelle, jedes Briefkastens und jeder Taube auf einer sehr langen Straße aufgezeichnet haben). Ich habe getestet, wie sich R-Indizes mit diesen Daten in Java verhalten, und andere im Feld haben sie mit Erfolg auf Flat-File-Formate angewendet. Jedoch hat niemand sie auf Datenbanken AFAIK angewendet, die das Ziel dieses Tests sind.
Hat jemand ein ähnliches Verhalten beim Hinzufügen großer Datenmengen zu einem räumlichen Modell beobachtet, das entlang einer bestimmten Achse nicht sehr unterschiedlich ist? Das Problem bleibt bestehen, wenn ich die Koordinatenverwendung umkehre. Ich führe das folgende Setup aus, wenn das eine Ursache ist
- MacOS 10.6.6
- MySQL 5.1.46