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

空间索引可以用于mysql中的连接吗?,mysql,query-optimization,spatial,spatial-index,Mysql,Query Optimization,Spatial,Spatial Index,空间索引可以用于连接mysql中的表吗 我有两个带有几何体列和空间索引的表。这张桌子是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 GE

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

我有两个带有
几何体
列和空间索引的表。这张桌子是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 | |id |选择|类型|类型|可能的|键|键|列|参考|行|额外| |1 | SIMPLE | a | ALL | asidx | NULL | NULL | NULL | 50000 || |1 | SIMPLE | b | ALL | bsidx | NULL | NULL | NULL | 50000 |使用where;使用连接缓冲区| 为什么不使用索引? 对于50k行表,它运行15分钟。
如何加快速度?

是的,空间索引可以用于联接,但您的联接没有使用索引

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

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

您的
ON
子句在联接中的两个表的列上指定一个函数。在两条记录都被读取之前,MySQL不会拥有函数所需的列值,因此不能为连接使用索引,需要进行完全扫描

基本上,MySQL在尝试之前不知道两条记录是否在一起,所以它必须尝试每一种组合


也许更好的解决方案是预先计算相交对表,将它们存储在单独的(连接)表中,然后以这种方式进行连接。

因为我需要相交记录,所以无需预先计算。这只是交叉点的计算。你是说没有办法加快速度吗?