【问题标题】:Why isn't MySQL using the index for this subquery?为什么 MySQL 不为此子查询使用索引?
【发布时间】:2008-11-14 05:24:39
【问题描述】:

我曾经这样做过:

SELECT layerID
FROM layers
WHERE ownerID = ?
AND collectionID = ?

这会给我一个 layerID 的数组,然后我会循环并为每个层执行此操作:

SELECT DATA
FROM drawings
WHERE layerID = ?

一切都很好。所以现在我想一步到位,所以我试试这个:

SELECT DATA , layerID
FROM drawings
WHERE layerID = ANY (
  SELECT layerID
  FROM layers
  WHERE ownerID = ?
  AND collectionID = ?
) 

但由于某种原因,它不使用索引,用于主查询,SELECT DATA etc!因此,与我之前执行的单独查询相比,这个组合查询需要更长的时间才能完成。 (顺便说一句,子查询SELECT layerID etc 仍然使用索引)。

我已通过使用“EXPLAIN”语句确定它是否使用查询。

我在layers 表的ownerIDcollectionID 列以及drawings 表的layerID 列上有单独的索引。

我的查询有什么问题?

【问题讨论】:

    标签: mysql optimization indexing subquery


    【解决方案1】:

    尝试加入。对于查询优化器而言,ANY 最终看起来很像不可优化的 UNION。

    SELECT d.DATA, d.layerID  
    FROM drawings AS d  
    INNER JOIN layers AS l ON d.layerID = l.layerID  
    WHERE l.ownerID = ? AND l.collectionID = ?
    

    【讨论】:

    • 成功了,谢谢。我会尽量避免使用子查询,而是更多地练习连接。只是子查询一开始对我来说更容易理解。
    【解决方案2】:

    我以前从未见过 ANY 关键字,但如果你尝试一下

    选择数据,层ID 从图纸 层 ID 在哪里( 选择层ID 从层 WHERE ownerID = ? AND collectionID = ? )

    会有同样的问题吗?我相信不应该。但是,INNER JOIN 可能要好一些。

    【讨论】:

    • 我相信“= ANY”和“IN”在大多数情况下会做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多