MySQL进阶系列:一条sql是怎么执行的

本文是在存储引擎是InnoDB的前提下

mysql中的针对表的操作可以分为增删改查四种操作,也就是常说的crud大法,根据类型分为DML(增删改)和DQL(查);今天就说下插后端框架入和查询的语句时如何mysql中执行的。

不管是DML还是DQL其他垃圾有哪些东西都是要经过连接器缓存分析器优化器后端开发工程师行器调用存储引擎的API。在前四个阶段都是一样存储引擎的流程,具体的可以参考 mysql基础架构篇,文章中有详细简介各个模块的作用,本其他和其它的区别文就不展开说了,后面我们详细说说执行器在存储引擎上是怎么查询和修改(删除/新增)的。

小知识:

扇区:mysql数据库命令大全 磁盘存储的最小单位,扇区一般大小为512Byte。

磁盘块: 文件系统与磁盘交互的的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块由连续mysql基础命令几个(2^n)扇区组成,块一般大小一般为4KB。

mysql页:系统运维工作内容 mysql中和磁盘交互的最小单位称为页,默认大小是16kb,也就是4个磁盘块。也就是说mysql在进行数据读取的是默其他垃圾有哪些东西认情况下一次就是读取16kb(可以修改),即是我只查询一条大小只有1kb的数据,mysql读取的也是16kb。

一条查询语句是怎么执行的

select查询比较简单,其实就是到数据恢复硬盘上按照页(1系统/运维6kb其他垃圾有哪些东西)把数据加mysql索引载到内存后端是什么工作,然后再去匹配where条件,找出符合条件的数据;

  1. 如果where条件没有索引,那么就是全表扫描,一次次的加载数据页到内存,然后一个个匹配。
  2. mysql安装果where条件是主键索引,那么就会把主键索引的数据页加载到内存,然后匹配到具体的行数据返回;
  3. 如果where条件是普通索引,那么就会把普通索引的数据页加载到内存,然后匹配到符合条件的叶子其他结点(B+树的叶子结点),如果能够使用覆盖索引,那么就会直接返存储引擎为什么的数据库无法修改回,如果不能使用覆盖索引,则会进行回表查询(走一次主键索引查询)。覆盖索引和回表不清楚的可以其他应收款是什么科目参考历史文章:​​需要知道的索引基础知识​​。

一条更mysql数据库新语句是怎么执行的

更新mysql基础命令语句首先要按照查询的流程执行,因为肯数据分析师定要先知道是哪条记录,之后才能去更新这条其他应收款是什么科目记录。之后就是更新了mysql数据库基础知识,更新操作涉及到几个日志的记录,分别是undolog(InnoDB的回滚日志) ,redol存储引擎为什么的数据库无法修改og(InnoDB的数据持久化日志),binlog(mysql server的归档日志),下面我们看下他们之间是怎么配合完成数据更新的。

  1. 首先执行引擎mysql安装按照条件找数据,如果内存中存在则直接返回,不存在查询后返回。
  2. 把查询系统运维工作内容出来的这条记录先放到undolog中,用于更新失败数据回滚,具体的使用可以参考上一篇文章​​多并发控制mvcc​​。数据恢复
  3. 执行器调用存储引擎接口写入数据,在缓存池中修改这条记录,。
  4. 写redo日志,先把数据更新到redo日志的缓存中。
  5. 准备提交事务,把redo日志缓存刷入磁盘。这时候re数据dolog 是prepa其他货币资金re阶段(共有两个阶段prepare和commit),然后通知执其他货币资金行器完成。
  6. 执行器开始执行binlog写入磁盘。
  7. 然后调用存储引擎的事务提交存储引擎为什么的数据库无法修改数据库名称接口,把redolog中的prepare改成commit状态,至此更新完成。
  8. 之后有I数据结构O线程以页为单位随机写入磁盘,把后端框架我们数据恢复更新后的数据慢慢落入磁盘中。数据废土

两个日志是分开写的,所以很难保证两个日志数据一致,在恢复的时候尽量保证同时参考两个日志文件,如果一致才会提交,不一致丢弃

假如在步骤8的时候更新失败,两种情况

  • sql执行失败,这后端时候使用后端框架undolog中记录的历史数据进行恢复即可。
  • 断电或者进程重启mysql索引,那么就会在下次重启的时候判断redolog是否是commit状态,如果是可以直接提交写入磁盘,如果不是commit状态,就会判断binlog是否完整(两阶段提交保证数据的一致性),如果完整那么数据有效,写入磁盘;如存储引擎果不完数据漫游整或者只有一系统运维是干嘛的个日志存在记录,直接丢弃即可。

为什么要用日志而不是直接写入后端数据库所在的磁盘呢

我们要更新的数据是存在磁盘的任意位置,是属于mysql数据库命令大全随机IO,效率是很低的,这样mysql的并发无法保证,而redo日志和bi其他综合收益nlog属于预写日志,都是顺序IO,直接写入即可后端开发,效率要高很多,即使失败了也可以根据日志恢复。

为什么要设计两阶段提交:

写入的新数据属于脏页,只有更新到磁盘才能是完整的数据

反证一下:

假如先写redo log 后写binlog: 如果在redolog写数据恢复完,binlog还没写完,mysql崩溃重启。重启之后可以通过redolog恢复数据,但是binlog是没有这条数据的,所以后续用binlog备份数据或者进行主从同步的时候都会丢失这条数据,这样和原库的数据是不一致的。

假如先写binlog后写redolog: 在binlog写完之后mysql崩溃,由于remysql索引dolog 没有mysql数据库基础知识写入,奔溃重启之后也不会也不会恢复数据,但是bi数据漫游是什么意思nlog中已经完整记录这条记录,所以之后binl数据恢复og备份mysql安装和主从同步会有这条数据,这样和原库又不一致了。

网上看的一张图,画的非常好,可以收藏mysql一下

总结一下

  1. 不管是查mysql数据库命令大全询语句还是更新语句,都要先经过连接器查询缓存(8.0已经mysql安装其他业务收入掉了),分析器优化器执行器
  2. 查询语句要选按照查询条件把数据所在的整页加载到内存。
  3. 更新语句在查询的基础上利用undo logmysql怎么读,redo log,bin log 完成数据数据废土的更新。
  4. undo log是用来sql执行失败之后回滚数据,保持事务的原子性。
  5. redo log是用于mysql崩溃恢复,保证已提交事务的ACID特性。
  6. binlog是数据记录的日后端是做什么的志文件,用于数据备份,主从同步。
  7. 直接更新记录然后刷盘是随机IO,效率低下,所以使用redolog顺序写,提高效率。
  8. 两阶段提交能够崩溃恢复,保证数据的一数据透视表致性。

欢迎评论区沟通交流


我是纪先生,用输出倒逼输入而持续学习,持续分享技术系列文章,以及全网值得收藏好文,欢迎关注公众号,做一个持续成长的技术人。