【问题标题】:Understanding MySQL explain, `rows`-wise理解 MySQL 解释,`rows`-wise
【发布时间】:2014-06-05 07:16:49
【问题描述】:

我试图弄清楚我应该如何考虑 MySQL explain 的输出的 rows 列。以下是MySQL documentation 对此的评价:

rows 列表示 MySQL 认为它必须的行数 检查以执行查询。

所以这是我的问题:

  1. 不管其准确性如何,这是在使用索引之后还是之前要检查的记录数?
  2. 我需要重视对高rows的表的优化是否正确?
  3. MySQL 将检查的记录总数是rows 列的乘积,这是真的吗?
  4. 有哪些策略可以减少rows

【问题讨论】:

    标签: mysql performance optimization


    【解决方案1】:
    1. 索引的含义是-DBMS 将首先查找那里,然后使用收集到的信息查找匹配的行。所以 - 是的,rows 将指示在使用索引之后 将检查多少行(当然,如果它们存在且适用)。这个问题意味着您对索引是什么感到困惑。它们不是什么魔法,它们只是真正的数据结构。它们的整体意义是减少用于执行查询的数据行数。
    2. 有争议。这个问题不能回答“是”或“否”。因为不同的表可能有不同的行定义——并且应用的操作也会不同。假设您有来自第一个表的100.000 行和来自第二个表的10.000 行。但是对于第一个表,您只选择普通值,而对于第二个表 - 比如标准偏差。也就是说:不仅行数很重要,而且你在用它们做什么。
    3. 您可能认为它与乘法有关,是的。但问题是 - 这不是确切会发生什么。当然,不是确切的计数。还有filtered 字段表示许多行受到应用条件的影响(如WHERE 子句中)。但是 - 一般来说,您可以将最终结果估计为10 的幂,即如果您在第一行有123.456.789 行,在第二行有111.222,您可以将其视为“选择大约1E8 x 1E5”行。
    4. 这些技术非常标准,它们都是关于优化查询的。第一步是查看how MySQL optimizes 查询的某些部分。并非所有查询都可以优化 - 通常这是一个过于宽泛的问题,因为某些解决方案可能会触及整个数据库和/或应用程序结构。但是了解如何正确使用索引、哪些可以(以及哪些不能)索引、如何创建有效的索引 - 就足够了。

    【讨论】:

    • 关于第四个问题:策略列表就可以了。例如调整索引、分区(也许!)。我不是在寻找完整的解决方案,只是指出会影响rows 的因素。
    • 没有任何策略。如下,从答案到第 1 点,适当的索引将减少行数。但是如果你有SELECT * FROM t呢?这就是为什么在通常情况下我们不能说减少行数。还能是什么?使用分区。或者调整数据库结构,使其更适合您的应用程序请求。而已。没有魔法,只有努力。
    • 如果只使用索引来查找匹配的行,rows应该为0吗?
    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2018-08-15
    • 2013-05-15
    • 1970-01-01
    • 2011-06-02
    • 2012-02-17
    相关资源
    最近更新 更多