【问题标题】:EXPLAIN rows always returning all rows in table解释行总是返回表中的所有行
【发布时间】:2013-08-18 22:10:16
【问题描述】:

我试图理解下面查询的 EXPLAIN 结果。我得到 rows=7 (表的总大小),但实际查询只返回 1 行。解释结果上的 rows=7 是否意味着 MySQL 检查每一行仍然得到这个结果?

 EXPLAIN SELECT conversation_id FROM messages 
    WHERE to_id = '355' AND timestamp < '1376856934' LIMIT 1;

只有 4 行有 to_id='355' 并且列 to_id 和 timestamp 都被索引在一起,所以我不明白为什么它必须扫描整个表才能得到 1 行。

【问题讨论】:

    标签: mysql explain


    【解决方案1】:

    EXPLAIN 输出中的“rows”列是对需要检查的行数的估计。

    查询是否真的需要检查表中的每一行实际上取决于访问计划(显示在 EXPLAIN 输出中的其他列中。例如,索引范围扫描操作不必查看每个行,只有特定索引范围内的行。但是全扫描操作会查看表中的每一行。

    根据“行”列中返回的值无法回答您的问题;我们真的需要查看 EXPLAIN 的输出来确定 MySQL 是否正在使用索引范围扫描。

    http://dev.mysql.com/doc/refman/5.5/en/explain-output.html

    【讨论】:

      【解决方案2】:

      来自 MySQL 文档:

      LIMIT 子句可用于限制 SELECT 语句返回的行数。

      EXPLAIN 描述了如何收集结果,LIMIT 仅限制应从先前收集的结果中返回哪些行。

      【讨论】:

      • 解释结果中的 rows=7 是否意味着 MySQL 检查每一行仍然得到这个结果?
      • 不,rows=7 表示 7 行符合您的条件 (WHERE to_id = '355' AND timestamp &lt; '1376856934')。 LIMIT 仅用于指定将从匹配的行中返回哪些行。在这种情况下,MySQL 将只加载第一行并从中找到conversation_id
      • @Gabor Garami:好点。但为了澄清,EXPLAIN 输出的“行”列是检查的行数的估计
      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2015-05-05
      • 2019-04-17
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多