0

我曾经这样做:

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

我在表中的ownerIDcollectionID列以及表中的列上有单独的索引。layerslayerIDdrawings

我的查询做错了什么?

4

2 回答 2

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 = ?
于 2008-11-13T20:52:01.950 回答
0

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

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

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

于 2008-11-13T21:24:39.200 回答