为什么MySQL不使用此子查询的索引?

时间:2008-11-13 20:41:31

标签: mysql optimization indexing subquery

我曾经这样做过:

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'语句确定它是否正在使用查询。

我在ownerID表格的collectionIDlayers列以及layerID表格中的drawings列上都有单独的索引。

我的查询错误是什么?

2 个答案:

答案 0 :(得分:5)

尝试加入。 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 = ?

答案 1 :(得分:0)

我之前从未见过任何关键字,但如果你尝试

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

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