查询的生命周期的下一步是将一个SQL转换成一个执行计划,mysql在依照这个执行计划和存储引擎进行交互。这包含多个子阶段:解析SQL、预处理、优化SQL执行计划。这个过程中任何错误都可能终止查询。
在优化器的内部,是开发者定义的许多“优化规则”来进行优化的,如关联查询重排,索引优选,连接查询重组,优化排序,优化聚合函数,提前终止查询,等价变化等;
这里我们简单来列举一下索引优选:
这个简单的例子应该可以感受到SQL优化器的作用是干什么的了,它内置很多规则,它贴合物理层,有自己的执行规则,同时又因为一些不合格的程序员写的sql不合规
这就导致SQL优化器非常重要了,能到sql优化器处理的sql基本上语法都是没问题的,主要的是怎么提高sql的执行效率,这就是优化器最大的作用
只要SQL优化器处理完了以后,就会生成执行计划,这个执行计划就是存储引擎的处理单元
生成执行计划以后,他就会交给执行器,去调用存储存储引擎的相应Headler API来完成相应的执行计划
这里的执行器和操作系统的操作系统差不多,都是负责调用和分发的,在sql执行中,执行器扮演两个角色
我们常说的索引查询,遍历查询,临时表查询等等行为都是在存储引擎中完成的
在我前面写的MySQL之存储引擎中有写道InnoDB是如何存储数据的,主要是内存的读写速度比硬盘的快,所以有了Buffer Pool ,这里当一个查询计划来了以后,他首先会去Buffer Pool中查看是否有关这次查询的相关更新,
如果没有,我们就会直接去磁盘中刷出数据到Buffer Pool中,然后由存储引擎负责返回给MySQL执行器,最后返回给服务器端
当Buffer Pool中有关此次查询的更新时,我们需要等到存储引擎把旧的值放到undo Log(用于事务回滚的日志)中,然后就会更新Buffer Pool和把更新数据刷入到磁盘,此时就可以去根据查询条件,查询数据到Buffer Pool中,
然后返回给MySQL执行器
有关InnoDB的存储,可以去看看我以前写的博客MySQL存储之InnoDB
MySQL的二阶段提交指的是MySQL为了保证redo Log和 Binlog的一致性而产生的一种设计,把日志写入和日志提交拆分成两个阶段,保证数据写入的一致性
广告
X 关闭
广告
X 关闭