SpatiaLite空间索引(一)
--SpatiaLite的入门手册翻译 Baldwin.Xue整理
原英文网址: http://www.gaia-gis.it/gaia-sins/spatialite-tutorial-2.3.1.html#mbr_cache
阅读SpatiaLite的入门手册第8节总结得到:
1: v.3.6.0 SQLite 以后的版本对RTree索引有稳定的实现
2:元数据表geometry_columns 中的spatial_index_enabled字段用了和一张数据表中的空间数据是否建立了控件索引并且可用。
3:SQLite RTree使用SQLite的VIRTUAL TABLE的方式实现的,一个RTree用四张表实现
- prefix (前缀)
- prefix_node
- prefix_parent
- prefix_rowid
4:SpatiaLite为了确保进入到主表中和主表关联的空间索引表的控件对象的高度一致建立了三个triggers(出发器)
5:你每次从主表中INSERT、UPDATE、DELETE一行数据你可以保证相应的索引信息也已经正确的更新了,因为活动的triggers会使这样约定生效。
6、如下不适用空间索引的按空间范围查询
SELECT tablename FROM fieldname
WHERE X(geom) > 730000 AND X(geom) < 734000
AND Y(geom) > 4810000 AND Y(geom) < 4850000;
如下是使用空间索引的按空间范围查询
SELECT tablename FROM fieldname WHERE ROWID IN
(SELECT pkid FROM idx_ tablename_geom WHERE
xmin > 730000 AND xmax < 734000 AND ymin > 4810000 AND ymax < 4850000);
注意:这两种查询在数据条数少的时候性能区分是不明显的,当时如果数据量比较大(如上数据达到MILLION级)的时候速度回又几分钟变成几秒钟。
7、删除空间索引的步骤
SELECT DisableSpatialIndex('NewTowns', 'geom');
DROP TABLE idx_NewTowns_geom;
VACUUM;
第一步调用DisableSpatialIndex;这样来移除trigger,以此来停止空间索引的更新。第二步,因为第一步并不会删除RTree自身所以要显示的调用DROP TABLE以在物理层面上把索引表删除掉。第三步,最好调用一下VACUUM,用以维护数据库的高效状态。
(经过这三步的操作只是把索引和出发器删除了,而元数据表geometry_column中的相应的数据却没有删除掉,如果要删除的话需要显示的调用SQL语句来删除这些数据)