可以使用空间索引在mysql中加入吗?

时间:2015-01-15 13:31:22

标签: mysql query-optimization spatial spatial-index

可以使用空间索引连接mysql中的表吗?

我有两个表,其中包含GEOMETRY列和空间索引。该表是MyISAM。 我想将这些表连接在相交的行上。 尽管在我的查询中使用FORCE INDEX,我仍然无法让mysql使用空间索引。

查询是:

SELECT * 
FROM a FORCE INDEX FOR JOIN (asidx) 
JOIN b FORCE INDEX FOR JOIN (bsidx) 
     ON Intersects(a.g, b.g) -- g is the name of the GEOMETRY

解释计划是:

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra                          |
|  1 | SIMPLE      | a     | ALL  | asidx         | NULL | NULL    | NULL | 50000 |                                |
|  1 | SIMPLE      | b     | ALL  | bsidx         | NULL | NULL    | NULL | 50000 | Using where; Using join buffer |

为什么不使用索引? 对于50k行表,它运行15分钟。 我怎样才能让它更快?

1 个答案:

答案 0 :(得分:1)

是的,空间索引可用于连接,但您没有为连接使用索引。

为了将索引用于搜索,MySQL需要一个常量或一个引用已经被读取的数据列的表达式。

您没有在ON子句中引用索引列。您引用的是01,这是INTERSECTS()函数的结果。

您的ON子句指定连接中两个表的列的函数。在两个记录都已被读取之前,MySQL将不具有该函数所需的列值,因此不能使用索引进行连接,需要完整扫描。

基本上,MySQL不会知道两个记录是否一起记录,所以它必须尝试每个组合。

或许更好的解决方案是预先计算交叉点对的表,将它们存储在单独的(联结)表中,然后以这种方式加入。