代码之家  ›  专栏  ›  技术社区  ›  davr

为什么MySQL不使用这个子查询的索引?

  •  0
  • davr  · 技术社区  · 16 年前

    我曾经这样做过:

    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 桌子

    我的问题有什么错?

    2 回复  |  直到 16 年前
        1
  •  5
  •   davr    16 年前

    尝试加入。对于查询优化器来说,任何结果都非常像一个不可优化的联合。

    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 = ?
    
        2
  •  0
  •   jishi    16 年前

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