【问题标题】:How MYSQL Engine works in QueryMYSQL 引擎在 Query 中的工作原理
【发布时间】:2017-04-04 22:44:36
【问题描述】:

我知道这个问题很简单,但我想有人解释一下,看看我是否正确。

这个简单的查询是不是MYSQL总是按照从左到右的语义执行?

SELECT c03,c04,c05,count(*) as c FROM table 
where status='Active' and c04 is not null and c05 is not null 
group by c03,c04,c05 
having c>1 order by c desc limit 10;

引擎从左到右开始过滤每条记录

* Status later comparing c04 and later c05
* Later groups the results
* later filters again the result applying the c>1 filter
* Later sorts and fetch the first 10 results and disposing the others

或者有一些其他的优化假设没有索引正在使用......

【问题讨论】:

    标签: mysql search-engine querying


    【解决方案1】:

    我猜Status later comparing c04 and later c05 取决于可用索引和列的cardinality,并不总是按该顺序进行评估。 MySQL 将首先尝试评估约束,这承诺以最低的成本最大程度地减少结果集,例如使用没有索引的列的约束可能会最后评估,因为评估成本很高。

    其余的为其他排序留下了很小的空间,但某些步骤可能会从适当的索引中受益。

    【讨论】:

    • 但是在过滤器之后接下来的步骤是这样的吗?稍后将结果分组 * 稍后再次过滤应用 c>1 过滤器的结果 * 稍后排序并获取前 10 个结果并处理其他结果
    • 是的,我想是的(这是我的第二段所指的)。至少我认为不可能以不同的顺序进行。过滤器必须在分组之后。在过滤之前排序是没有意义的,因为过滤的复杂度是O(n),而排序需要O(n log n),所以优化器应该在排序之前减少结果集。并且只有在排序之后才能选择前 10 行。
    猜你喜欢
    • 2013-08-25
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多