MYSQL引擎在查询中的工作原理

MYSQL引擎在查询中的工作原理,mysql,search-engine,querying,Mysql,Search Engine,Querying,这是一个简单的问题,我知道,但我想有人解释我,看看我是否得到正确的 这个简单的查询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; 引擎从左到右启动,按顺序过滤每个记录 *

这是一个简单的问题,我知道,但我想有人解释我,看看我是否得到正确的

这个简单的查询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
或者进行一些其他优化,假设索引未使用…

我猜稍后比较c04和c05的状态取决于可用索引和列的长度,并且不总是按照该顺序进行计算。MySQL将首先尝试评估约束,这承诺以最低的成本最大限度地减少结果集,例如,使用不带索引的列的约束可能会在最后评估,因为评估成本很高


其余的步骤几乎没有空间进行其他排序,但某些步骤可能会从适当的索引中获益。

但在筛选之后,接下来的步骤是什么?稍后对结果进行分组*稍后再次筛选应用c>1筛选的结果*稍后排序并获取前10个结果并处理其他结果,我想这就是我第二段提到的。至少我看不到以不同的顺序做这件事的可能性。筛选器必须在分组后出现。在筛选之前进行排序没有任何意义,因为筛选的复杂性为On,而排序则为log n,因此优化器应该在对结果集进行排序之前减少结果集。只有在排序之后才能选择前10行。