2008-11-13 87 views
0

我曾经这样做:为什么MySQL不使用这个子查询的索引?

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'语句。

我对在layersownerIDcollectionID列单独的索引,并在drawings表中的列layerID

我在做什么错我的查询?

回答

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 = ? 
+0

这样做了,谢谢。我会尽量避免使用子查询,而是通过连接练习更多。只是子查询一开始就比较容易理解。 – davr 2008-11-13 21:21:19

0

我从来没有见过ANY关键字之前,但如果您尝试

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

意志有同样的问题?我相信它不应该。然而,INNER JOIN可能会好一点。

+0

我认为“= ANY”和“IN”在大多数情况下完全相同。 – davr 2008-11-14 08:07:05

相关问题