空间索引可以用于mysql中的连接吗?
空间索引可以用于连接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
几何体列和空间索引的表。这张桌子是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在尝试之前不知道两条记录是否在一起,所以它必须尝试每一种组合
也许更好的解决方案是预先计算相交对表,将它们存储在单独的(连接)表中,然后以这种方式进行连接。因为我需要相交记录,所以无需预先计算。这只是交叉点的计算。你是说没有办法加快速度吗?