【问题标题】:can spatial indexes be used for join in mysql?空间索引可以用于mysql中的连接吗?
【发布时间】:2015-01-15 13:31:21
【问题描述】:

空间索引可以用来连接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

解释计划是:

|编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | | 1 |简单 |一个 |全部 |阿西德 |空 |空 |空 | 50000 | | | 1 |简单 |乙 |全部 | bsidx |空 |空 |空 | 50000 |使用哪里;使用连接缓冲区 |

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

【问题讨论】:

    标签: mysql query-optimization spatial spatial-index


    【解决方案1】:

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

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

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

    您的ON 子句在连接中两个表的列上指定了一个函数。在读取两条记录之前,MySQL 不会拥有该函数所需的列值,因此无法将索引用于连接,需要完全扫描。

    基本上,MySQL 在尝试之前不知道两条记录是否在一起,因此它必须尝试所有组合。

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

    【讨论】:

    • 由于我需要相交的记录,因此无需预先计算。只有交点的计算。你是说没有办法加快速度?
    猜你喜欢
    • 2012-01-04
    • 2011-03-02
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多