MySQL空间数据速度

3
我有一张表,其中包括SMALLINT类型的xy字段以及POINT类型的pt字段,设置为POINT(x,y);
xy具有普通索引,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`);

...表明通过xy查询速度快了1.5倍:
在10个查询中,3.45±0.10ms比4.61±0.14ms快。
xy始终是INT类型,只查询矩形(甚至是正方形)区域。是的,这是铁板钉钉的。

主要问题是:
我是否错过了索引或者在这种情况下空间数据是否过于复杂?

  • MySQL版本为5.1.37
  • DB引擎类型为MyISAM(默认)
  • 当前表大小为5k行,计划在生产中为10-30k行。

我有一些MySQL的经验,但从未使用过空间数据类型和空间索引。

1个回答

1

你的表上有一个联合的x和y索引吗?如果是的话,那么是非常快的。 我认为空间索引具有更广泛的用途。一个多边形结构可以有很多顶点,而矩形只是更通用构造的一种情况。

如果一个矩形边界区域对你的需求足够了,那么我建议你选择x和y字段的解决方案,而不是增加地理空间扩展功能的复杂性。


哦,那个版本的MySQL中好像没有看到任何组合索引。 - kirilloid
1
通过“组合索引”,我指的是在两个或更多字段上的索引。我相信MySQL的任何版本都可以做到这一点。您可以在x和y列上添加索引: ALTER TABLE table_name ADD INDEX(x,y);请记住,仅使用“x”字段的条件查询将从此索引中受益,SELECT * FROM table_name WHERE x BETWEEN 100 AND 200;而仅使用“y”字段的条件查询将不使用此索引。 - georgepsarakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接