我曾经这样做过:
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
表格的collectionID
和layers
列以及layerID
表格中的drawings
列上都有单独的索引。
我的查询错误是什么?
答案 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可能会好一些。