mysql - 为什么 MySQL 不使用该子查询的索引?

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

我在 layers 表中的 ownerIDcollectionID 列以及 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/

相关文章:

mysql - 在sql查询中复制行

php - 成员(member)网站每天减少天数

mysql - 没有子查询的更新会引发错误 : Subquery returns more than 1 row

c - 如何在 C 中返回多维数组元素的索引?

javascript - 给定多个对象键获取数组对象元素的索引

MySQL 没有使用最佳组合键

MySQL:组合 2 个 JOINS

c++ - 奇怪的相同数字

c++ - 了解内存池

matlab - 在 matlab 中求解线性优化