编程语言爱好者Java服务器端编程JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

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

2021-01-08  本文已影响0人  迦叶_金色的人生_荣耀而又辉煌

上一篇 <<<MySql连接空闲8小时自动断开的原因及连接池配置方法
下一篇 >>>


查询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中恢复。

上一篇 下一篇

猜你喜欢

热点阅读