查询和更新sql语句执行原理

上一篇 <<<MySql连接空闲8小时自动断开的原因及连接池配置方法
下一篇 >>>MySQL存储引擎汇总


查询sql语句执行原理

1、先走Mysql自带缓存(和InnoDB的Buffer Pool不同,任何改动都会清楚),注意:mysql8去除缓存机制。
2、词法解析:从左到右将整个sql语句拆分成n多个单词,根据规则识别单词,最终分成关键字和非关键字。
语法解析:判断sql语句是否满足规则,最终生成一个语法树。
3、预处理器:检查表名、列表等是否正确
4、通过优化器执行优化策略
5、查询表对应的存储引擎,读取存储数据(存储路径查看:show variables like 'datadir';
6、将数据缓存到Mysql缓存中,并返回结果给应用程序。

更新sql语句执行原理

1、赌球磁盘的IO数据到缓冲区
2、将原来的数据旧值写入到undoLog日志中,方便后续事务回滚
3、更新缓冲区内存的值
4、记录redoLog日志
5、如果准备提交事务的情况下,将redoLog日志刷新到磁盘中(顺序IO操作
6、写入binlog文件到硬盘中
7、后台定时IO线程将缓冲区的数据刷新到磁盘中(随机IO操作

a、UndoLog/RedoLog/BinLog日志之间的区别

  • RedoLog日志:记录数据页修改的日志,方便后期mysql崩溃宕机的时候实现数据的恢复【InnoDB引擎自带】
  • UndoLog日志:记录事务的回滚日志【InnoDB引擎自带】
  • BinLog日志:对sql语句实现增量日志,便于主从复制、集群等【MySQL服务器自带】

b、顺序IO和随机IO的区别

顺序IO:假设我们已经找到了第一块数据,并且其他所需的数据就在这一块数据后边,那么就不需要重新寻址,可以依次拿到我们所需的数据
随机IO:假设我们所需要的数据是随机分散在磁盘的不同页的不同扇区中的,那么找到相应的数据需要等到磁臂(寻址作用)旋转到指定的页,然后盘片寻找到对应的扇区,才能找到我们所需要的一块数据,一次进行此过程直到找完所有数据,这个就是随机IO,读取数据速度较慢。

为什么RedoLog采用顺序IO,而磁盘的写入使用随机IO?
因为记录日志不需要建立索引目录结构,直接追加日志文件后面即可,而我们写入磁盘物理存储的数据,需要建立索引的文件
索引文件排列数据都不在同一个扇区中,所以写入磁盘的数据采用随机io。
顺序IO效率比随机IO效率要高

c、缓存池与硬盘存储数据如何解决?

原因:修改语句更新了缓冲池中内容,后台开启N多个线程写入磁盘,此时断电了。
解决办法:RedoLog已记录了数据页修改的日志,下次启动时可以从RedoLog中恢复。


推荐阅读:
<<<MySQL发展历程与整体架构
<<<MySql连接空闲8小时自动断开的原因及连接池配置方法
<<<MySQL存储引擎汇总
<<<InnoDB存储引擎的Buffer Pool 缓冲池底层结构
<<<Too many connections分析与processlist解读
<<<MySQL索引底层结构与实现原理
<<<MySql的表锁行锁及间隙锁
<<<MySQL的并发文件及事务隔离级别
<<<MySQL的MVCC多版本控制原理
<<<MySQL常用命令汇总

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容