我曾经这样做过:
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
表中的 ownerID
和 collectionID
列以及 layerID
上有单独的索引drawings
表中的列。
我的查询有什么问题?
最佳答案
尝试加入。对于查询优化器,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 = ?
关于mysql - 为什么 MySQL 不使用该子查询的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/288210/