经过了分析器,MySQL知道要做什么。在具体执行SQL语句之前,还要先经过优化器的处理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;
或者在一个语句有多表关联(join) 的时候,决定各个表的连接顺序,等等。
比如执行下面这样的语句,执行两个表的join:
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
- 既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是 否等于20。
- 也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否 等于10。
这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,不同的执行方式对SQL语句的执行效率影响很大 。
优化器的作用就是决定选择使用哪一个方案:
- RBO:基于规则的优化
- CBO:基于成本的优化
优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。
