我有一张表,其中包括SMALLINT类型的
典型查询的分析:
x
和y
字段以及POINT类型的pt
字段,设置为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倍:
在10个查询中,3.45±0.10ms比4.61±0.14ms快。
x
和y
始终是INT类型,只查询矩形(甚至是正方形)区域。是的,这是铁板钉钉的。
主要问题是:
我是否错过了索引或者在这种情况下空间数据是否过于复杂?
- MySQL版本为5.1.37
- DB引擎类型为MyISAM(默认)
- 当前表大小为5k行,计划在生产中为10-30k行。
我有一些MySQL的经验,但从未使用过空间数据类型和空间索引。
table_name
ADD INDEX(x
,y
);请记住,仅使用“x”字段的条件查询将从此索引中受益,SELECT * FROMtable_name
WHERE x BETWEEN 100 AND 200;而仅使用“y”字段的条件查询将不使用此索引。 - georgepsarakis