mysql内部_MySQL SQL语句内部剖析

一条SQL在MySQL体系结构内的执行流程:

e840242e9c297b12d5cde88def4e8fc6.png

注意只有查询操作才会走查询缓存,而表的结构和数据发生改变时将会清空查询缓存。所以开启查询缓存的意义不大,8.0后已经废弃了该功能。

一条update在存储引擎内部的执行步骤如下:

SQL:update t set c=c+1 where id=2;

ad2ea56993c4ed5cebdc1221f271ec9d.png

SQL完整流程剖析:

1.首先客户端通过tcp/ip发送一条sql语句到server层的SQL interface

2.SQL interface接到该请求后,先对该条语句进行解析,验证权限是否匹配

3.验证通过以后,分析器会对该语句分析,是否语法有错误等

4.接下来是优化器器生成相应的执行计划,选择最优的执行计划

5.之后会是执行器根据执行计划执行这条语句。在这一步会去open table,如果该table上有MDL,则等待。如果没有,则加在该表上加短暂的MDL(S)

(如果opend_table太大,表明open_table_cache太小。需要不停的去打开frm文件)

6.进入到引擎层,首先会去innodb_buffer_pool里的data dictionary(元数据信息)得到表信息(实际上第5步调用了第6步的过程,mysql server层和innodb层都保存了表结构信息)

7.通过元数据信息,去lock info里查出是否会有相关的锁信息,并把这条update语句需要的锁信息写入到lock info里

8.然后涉及到的老数据通过快照的方式存储到innodb_buffer_pool里的undo page里,并且记录undo log修改的redo

(如果data page里有就直接载入到undo page里,如果没有,则需要去磁盘里取出相应page的数据,载入到undo page里)

9.在innodb_buffer_pool的data page做update操作。并把操作的物理数据页修改记录到redo log buffer里。

由于update这个事务会涉及到多个页面的修改,所以redo log buffer里会记录多条页面的修改信息。

因为group commit的原因,这次事务所产生的redo log buffer可能会跟随其它事务一同flush并且sync到磁盘上

10.同时修改的信息,会按照event的格式,记录到binlog_cache中。(这里注意binlog_cache_size是transaction级别的,不是session级别的参数,

一旦commit之后,dump线程会从binlog_cache里把event主动发送给slave的I/O线程)

11.之后把这条sql,需要在二级索引上做的修改,写入到change buffer page,等到下次有其他sql需要读取该二级索引时,再去与二级索引做merge

(随机I/O变为顺序I/O,但是由于现在的磁盘都是SSD,所以对于寻址来说,随机I/O和顺序I/O差距不大)

12.此时update语句已经完成,需要commit或者rollback。这里讨论commit的情况,并且双1

13.commit操作,由于存储引擎层与server层之间采用的是内部XA(保证两个事务的一致性,这里主要保证redolog和binlog的原子性),所以提交分为prepare阶段与commit阶段

14.prepare阶段,生成xid,持有prepare_commit_mutex锁,并且write/sync redo log;将回滚段设置为Prepared状态,binlog不作任何操作。

15.commit阶段,由于之前该事务产生的redolog已经sync到磁盘了。所以这步write/sync Binlog,并且在redo log里标记commit,最后释放prepare_commit_mutex

16.当binlog和redo log都已经落盘以后,如果触发了刷新脏页的操作,先把该脏页复制到doublewrite buffer里,把doublewrite buffer里的刷新到共享表空间,然后才是通过page cleaner线程把脏页写入到磁盘中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Backbone.js创建一个联系人管理系统(四)

原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程是基于这一系列的前三个教程. 有不清楚的请先阅读前三部分. 开始 在Contact原模版里添加一个edit按钮. <button class"ed…

mysql默认时间怎么不同步_MYSQL 更新时间自动同步与创建时间默认值共存问题

本文作者&#xff1a;苏生米沿在使用SQL的时候&#xff0c;希望在更新数据的时候自动填充更新时间&#xff0c;那么在mysql中是如何实现的呢&#xff1f;如创建表usersCREATE TABLE RS_SIGNUPUSER (ID VARCHAR(36) COMMENT 主键(业务功能无关),USERNAME VARCHAR(50) COMMENT 姓…

python代码技巧_让你python代码更快的3个小技巧

大家好&#xff01;今天呢&#xff0c;我们来聊一聊如何加速你的 python 代码。Python 语言的优点可以列举出许多&#xff0c;语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西&#xff0c;python 一个明显缺点就是运行速度慢&#xff0c;至少跟 C 语言没法比…

从此走上一条iOS程序猿不归路。。。

新的城市&#xff0c;新的生活&#xff01;前不久刚刚结束了苦逼的面试找工作之旅&#xff0c;期间也小有收货&#xff0c;如今正处年底工作闲暇之余&#xff0c;将前一阵子陆陆续续的总结整理了一下&#xff0c;本人菜鸟程序猿一只&#xff0c;水平有限&#xff0c;本文总结的…

springboot mysql事物_在Spring Boot中使用数据库事务

关于数据库访问还有一个核心操作那就是事务的处理了&#xff0c;前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了&#xff0c;其实不用猜&#xff0c;我们也知道Spring Boot在数据库事务处理问题上也给我们带来惊喜&#xff0c;OK&#xff0c;废话不多说&#…

cinder连接mysql数据库_Openstack入门篇(十六)之Cinder服务的部署与测试

1.理解块存储服务操作系统获得存储空间的方式一般有两种&#xff1a;通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘&#xff0c;然后分区、格式化、创建文件系统&#xff1b;或者直接使用裸硬盘存储数据(数据库)通过 NFS、CIFS 等 协议&#xff0c;mount 远程的文件系统第一种…

最后关于Pipeline完整的图如下:

最后关于Pipeline完整的图如下&#xff1a; 转载于:https://www.cnblogs.com/aaa6818162/p/5077988.html

amr 转mp3 java_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7

场景近期在做微信开发时&#xff0c;需要获取用户发给公众服务号的语音留言。而从微信服务端下载来的语音格式却是amr的格式&#xff0c;同样的你手机录音、Android语音等也都是生成amr格式文件。但当你想在web页面去播放此文件时&#xff0c;就困难了。因为无论是当前HTML5的标…

dragloader.js帮助你在页面原生滚动下实现Pull Request操作

dragloader.js是一个面向移动Web开发的JavaScript库&#xff0c;帮助开发者在使用页面原生滚动时&#xff0c;模拟上/下拉手势&#xff0c;实现Pull Request操作。 在移动设备上&#xff0c;一般会使用 drag down 手势实现加载最新 使用 drag up 手势实现加载更多 dragloader样…

怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

我们都知道要运行Java代码就必须要有JRE&#xff0c;也就是Java运行时环境&#xff0c;JRE中包含了Java程序的必需组件&#xff0c;包括Java虚拟机以及Java核心类库&#xff0c;然而运行C代码则不需要额外的运行时环境&#xff0c;只需要把代码编译成CPU能识别的指令即可&#…

【AJAX】AJAX实现搜索信息自己主动推荐并补全

好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完。我们在搜索引擎中输入文字时文本框下会提示对应的信息&#xff0c;这个案例就是实现这样的基本功能&#xff0c;代码比較粗糙还须要进一步完好&#xff0c;当中有些地方也须要向大神们请教一下。完毕效果截图&am…

使用IntelliJ IDEA 14和Maven创建java web项目

安装Maven 下载安装 去maven官网下载最新版。 解压到安装目录。 配置 右键桌面的计算机图标&#xff0c;属性–>高级系统设置–>环境变量&#xff0c;添加M2_HOME的环境变量&#xff0c;然后将该变量加入的PATH中。 注意 必须要有JAVA_HOME和个环境变量&#xff0c;不然m…

工作那点小事

目录 工作那点小事总结回到顶部工作那点小事 离开了“火龙果”&#xff0c;领导&#xff0c;领导的领导&#xff0c;领导的领导的领导&#xff0c;同事&#xff0c;同事等等&#xff0c;给你上了一堂课。 面试时&#xff0c;问&#xff1a;为什么离开上一家公司&#xff1f;答&…

Testlink1.9.5的安装配置

前两天搭建了Testlink环境&#xff0c;在这里整理记录下过程中遇到的问题以及搭建流程。Testlink版本&#xff1a;1.9.5操作系统&#xff1a;Windows7 32bit 步骤一&#xff1a;安装XAMPP 下载解压xampp压缩包&#xff0c;点击安装包xampp-win32-1.8.0-VC9-installerservice se…

UIAutomator输入中文

之前一直是英文的测试环境&#xff0c;包括手机也是英文的&#xff0c;app也是英文的&#xff0c;涉及不到中文输入法的东西。但现在在写中文的app&#xff0c;所以需要输入中文。看到网上的解决办法如下: 下载https://github.com/sumio/uiautomator-unicode-input-helper源码 …

jni java返回数组_Android开发实践:Java层与Jni层的数组传递

Android开发中&#xff0c;经常会在Java代码与Jni层之间传递数组(byte[])&#xff0c;一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层&#xff0c;由Jni层的Socket代码发送出去&#xff0c;当然&#xff0c;Jni层也需要把从Socket接收到的数据流返回给Java层。我…

jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...

由JspMysql注入到root权限的全程展最近有点空闲,所以写点垃圾文章来消磨一下时间.文中没有什么技术含量,如果要转载,请注明作者并保持文章的完整.很多人可能都知道asp,php的编程要防止sql注入漏洞,而并不知道jsp编程同样也需要防备sql注入漏洞.其实,一旦jsp代码有注入漏洞,将直…

Divide and conquer:Dropping tests(POJ 2976)

最大化平均值 题目大意&#xff1a;给定你n个分数&#xff0c;从中找出k个数&#xff0c;使∑a/∑b的最大值 这一题同样的也可以用二分法来做&#xff08;用DP会超时&#xff0c;可见二分法是多么的实用呵&#xff01;&#xff09;&#xff0c;大体上是这样子&#xff1a;假设最…

java中标准封装结构_java中的构造,封装

今天给大家讲一下面向对象中的构造&#xff0c;封装&#xff1b;构造&#xff1a;构造方法有以下几个特点&#xff1a;1.方法名和类名一致。2.无返回类型。接下来的几种构造样式&#xff0c;直接上代码吧&#xff1a;//这是一个宠物类 有一个属性&#xff1a;名字(name)public …

《白日梦想家》观后感

To see the world, things dangerous to come to, To see behind walls, to draw closer, To find each other and to feel That is the Purpose of LIFE.” 这部片子我很喜欢&#xff0c;大概我在现实生活中&#xff0c;也就是一个梦想家吧。想过很多事&#xff0c;但是真正去…