可以使用空间索引连接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分钟。 我怎样才能让它更快?
答案 0 :(得分:1)
是的,空间索引可用于连接,但您没有为连接使用索引。
为了将索引用于搜索,MySQL需要一个常量或一个引用已经被读取的数据列的表达式。
您没有在ON
子句中引用索引列。您引用的是0
或1
,这是INTERSECTS()
函数的结果。
您的ON
子句指定连接中两个表的列的函数。在两个记录都已被读取之前,MySQL将不具有该函数所需的列值,因此不能使用索引进行连接,需要完整扫描。
基本上,MySQL不会知道两个记录是否一起记录,所以它必须尝试每个组合。
或许更好的解决方案是预先计算交叉点对的表,将它们存储在单独的(联结)表中,然后以这种方式加入。