我有一个表,其中x
和y
字段为SMALLINT类型,pt
字段为POINT类型,设置为POINT(x
, y
);x
和y
有正常索引,pt
有空间索引集。
分析典型查询
select sql_no_cache
count(0) from `table_name`
where (x between -50 and 50)
and (y between -50 and 50);
-- vs
set @g = GeomFromText('Polygon((-50 -50, 50 -50, 50 50, -50 50, -50 -50))');
select sql_no_cache
count(0) from `table_name`
where MBRContains(@g, `pt`);
…显示通过x
和y
查询要快1.5倍:
3.45±0.10ms vs 4.61±0.14ms/10查询x
和y
总是INT,并且只查询矩形(甚至正方形)区域。是的,这是刻在石头上的;-)
主要问题是:
我是否错过了一些关于指数的东西,或者在这种情况下空间数据是多余的?
- MySQL版本为5.1.37
- 数据库引擎类型为MyISAM(默认)
- 当前表大小为5k行,在生产中计划为10-30k。
我有一些MySQL的经验,但从来没有使用过空间数据类型和空间索引。
是否有组合的x &表上的INDEX ?如果是这样,那么是的,这是非常快的。我相信空间索引有更广泛的用途。一个多边形结构可以有很多顶点,而矩形是一个更通用的结构。
如果矩形边界区域足以满足您的需求,那么我宁愿建议您使用x和y字段解决方案,而不是添加地理空间扩展功能的复杂性。