执行计划 分析一条sql语句的效率 mysql_MySQL中一条SQL语句的执行过程

MySQL中一条SQL语句的执行过程

发布时间:2018-11-24 18:35,

浏览次数:390

, 标签:

MySQL

SQL

查询语句的执行顺序:

1.客户端通过TCP连接发送连接请求到mysql连接器,连接器会对该请求进行权限验证及连接资源分配(max_connections,8小时超时)

2.建立连接后客户端发送一条语句,mysql收到该语句后,通过命令分发器判断其是否是一条select语句,如果是,在开启查询缓存的情况下,先在查询缓存中查找该SQL是否完全匹配,如果完全匹配,验证当前用户是否具备查询权限,如果权限验证通过,直接返回结果集给客户端,该查询也就完成了。如果不匹配继续向下执行。(

注意:此步并不做词法及语法分析,也就是用不到分析器,这块原来我也很疑惑,如果不做分析mysql怎么知道我要查什么?解释如下:{MySQL将缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了以下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些其他可能影响返回结果的信息。

当判断缓存是否命中时,MySQL不会进行解析查询语句,而是直接使用SQL语句和客户端发送过来的其他原始信息。所以,任何字符上的不同,例如空格、注解等都会导致缓存的不命中。}

其实说白了大概就是拿着你的SQL和原始缓存的SQL比对)

3.如果在查询缓存中未匹配成功,则将语句交给分析器作语法分析,MySQL需要知道到底要查哪些东西,如果语法不对,就会返回语法错误中断查询。

4.分析器的工作完成后,将语句传递给预处理器,检查数据表和数据列是否存在,解析别名看是否存在歧义等

5.语句解析完成后,MySQL就知道要查什么了,之后会将语句传递给优化器进行优化(通过索引选择最快的查找方式),并生成执行计划。

6.之后交给执行器去具体执行该语句,在执行之前,会先检查该用户是否具有查询权限,如果有,继续执行该语句。执行器开始执行后,会逐渐将数据保存到结果集中,同时会逐步将数据缓存到查询缓存中,最终将结果集返回给客户端。(缓存到查询缓存受到几个参数的影响

1.query_cache_type 是否打开查询缓存,默认为OFF  2.query_cache_size:查询缓存使用的总内存空间,默认值为1M

3.query_cache_limit

对于大于该值的结果集不会被缓存,默认值1M,在8.0版本后该参数被移除了)(如果该SQL执行过程中超过了慢查询阀值,该SQL会被记录到慢查询日志中)

#######################################################

一条更新语句的执行顺序:

1.客户端通过TCP连接发送连接请求到mysql连接器,连接器会对该请求进行权限验证及连接资源分配(max_connections,8小时超时)

2.建立连接后客户端发送一条语句,mysql收到该语句后,通过命令分发器判断其是否是一条更新语句,如果是,则直接发送给分析器做语法分析。

3.分析器阶段,MySQL需要知道到底要查哪些东西,如果语法不对,就会返回语法错误中断查询

4.分析器的工作完成后,将语句传递给预处理器,检查数据表和数据列是否存在,解析别名看是否存在歧义等

5.语句解析完成后,MySQL就知道要查什么了,之后会将语句传递给优化器进行优化(通过索引选择最快的查找方式),并生成执行计划。

6.执行器根据生成的执行计划去open

table,此时会先去查看该表上是否有元数据(MDL)排他锁(如果有元数据共享锁则无影响),如果有元数据排他锁,则事物被阻塞,进入等待状态(时间由lock_wait_timeout决定,默认是一年。。。。),等元数据锁被释放,继续执行。如果无元数据锁或者是有元数据共享锁,则该事务在表上加元数据共享锁(因为元数据共享读锁之间是不冲突的,如果表上有元数据共享锁,我们执行alter

table这样的DDL语句时,会进入等待状态,因为DDL语句需要在表上加元数据排他锁)

7.进入引擎层(默认innodb),去innodb_buffer_pool里面的data dictionary得到表得相关信息

8.根据表信息去innodb_buffer_pool里面的lock

info查看是否有相关的锁信息,如果有则等待(因为要加排它锁),如果没有则加排它锁,更新lock info。

9.取读取相关数据页到innodb_buffer_pool中(如果数据页本身就在缓存中,则不用从硬盘读取)

10.将页中的原始数据(快照)保存到undo log buffer中(undo log buffer会以相关参数定义的规则进行刷盘操作写入到undo

tablespace中)

11.在innodb_buffer_pool中将相关页面更新,该页变成脏页(脏页会以相关参数定义的规则进行刷盘操作写入所属表空间中)

12.页面修改完成后,会把修改后的物理页面保存到redo log buffer中,(redo log

buffer会以相关参数定义的规则进行刷盘操作写入到redo tablespace中)

13.如果开启binlog,则更新数据的逻辑语句也会记录在binlog_cache中(binlog会以相关参数定义的规则进行刷盘操作写入到binlog

file 中)

14.如果该表上有二级索引并且本次操作会影响到二级索引,则会把相关的二级索引修改写入到innodb_buffer_pool中的change

buffer里(change buffer 会以相关参数定义的规则进行刷盘操作写入所属表空间中)

15.前期的准备工作到此已经做完了,之后便是事务的commit或者rollback操作。一般情况下执行的是commit操作

16.执行commit操作后(mysql默认开启自动提交,如果手动开始事务begin,则需要显示提交commit),由于要保证redolog与binlog的一致性,redolog采用2阶段提交方式。

17.将undo log buffer及redo log

buffer刷盘(innodb_flush_log_at_trx_commit=1),并将该事务的redolog标记为prepare状态。

18.将binlog_cache数据刷盘(sync_binlog=1)

19.如果开启了主从结构,此时会将binlog_cache中的信息通过io线程发送给从机,如果开启了半同步复制则需要等待从机落盘(relay

log)并反馈。如果是异步复制则无需等待(默认是异步复制)

20.待binlog落盘完成,再将redolog中该事务信息标记为commit,释放相关锁资源。此时一个更新事务的操作已经完成,返回给客户端成功更新提示。

21.标记undolog中该事务修改页的原始快照信息为delete,当无其他事务引用该原始数据时(MVCC),再将其删除

22.如果此时触发了脏页刷盘操作,会先将脏页写入到double write

buffer中(防止写入过程中出现断页,因为mysql页面默认为16K,linux操作系统最大为4K,如果写了8K时系统挂了,这个数据页将不完整,标记为损坏)然后再写到期所在表空间的相应位置。

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

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

相关文章

周报_2012第11周(2012/03/11-2012/03/17)

项目:X保密项目 2012.03.12 // Win XP 需要判断取消操作. By lishupeng360.cn 2012/03/12 11:49. if (FileOp.fAnyOperationsAborted) { bRet FALSE; } const int gcn_SEC_DELAY 100; // 等待 HTTP Download 下载线程处理网络数据。 …

LeetCode 246. 中心对称数(哈希)

文章目录1. 题目2. 解题1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。 请写一个函数来判断该数字是否是中心对称数,其输入将会以一个字符串的形式来表达数字。 示例 1: 输入: "69&qu…

LeetCode 276. 栅栏涂色(DP)

文章目录1. 题目2. 解题2.1 DP超时解2.2 DP解1. 题目 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色,并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后,返回所有有效…

学习编程好榜样

学习编程好榜样 忠于gaming忠于down 代码分明不忘本 逻辑清晰容错强 逻辑清晰容错强 ! 学习编程好榜样 放到哪里哪里run 愿作系统的中间件 开源主义思想放光芒 开源主义思想放光芒! 学习编程好榜样 调试跟踪永不忘 注释文档是模范 开源主义品德多高尚 …

python threading setdaemon_Python中threading的join和setDaemon的区别[带例子]

python的进程和线程经常用到,之前一直不明白threading的join和setDaemon的区别和用法,今天特地研究了一下。multiprocessing中也有这两个方法,同样适用,这里以threading的join和setDaemon举例。1、join ()方法:主线程A…

LeetCode 1176. 健身计划评估(滑动窗口)

文章目录1. 题目2. 解题1. 题目 你的好友是一位健身爱好者。前段日子,他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。 他会有一份计划消耗的卡路里表,其中 calories[i] 给出了你的这位好友在第 i 天需要消耗的卡路里总量。 为…

为什么苹果不再需要谷歌地图?

苹果和谷歌之间的专利大战正是如火如荼,在这种两军对垒的时候,iOS设备上的那个明晃晃的谷歌地图图标就像眼中钉肉中刺一样让苹果始终不得安宁,让对手的核心服务扎根到自己的核心平台中,这感觉肯定不好。在最新版本的iPhoto中&…

java sax解析xml_【转】java使用sax解析xml文件

从下面这个url搬运。http://hck.iteye.com/blog/1175762不过程序略有改动。关于sax(搬自百科)SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包。SAX是事件驱动型 XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是…

LeetCode 422. 有效的单词方块

文章目录1. 题目2. 解题1. 题目 给你一个单词序列&#xff0c;判断其是否形成了一个有效的单词方块。 有效的单词方块是指此由单词序列组成的文字方块的 第 k 行 和 第 k 列 (0 ≤ k < max(行数, 列数)) 所显示的字符串完全相同。 注意&#xff1a; 给定的单词数大于等于…

中断处理

首先在获得PCI配置空间资源的时候&#xff0c;就要获得中断资源&#xff0c;根据CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Type 域来区分需要获得什么样的中断资源的时候&#xff0c;如果Type类型为&#xff1a;CmResourceTypeInterrupt&#xff0c;此时需要将中断资源从CM_PART…

java calendar计算时间差_Java Calendar 计算时间差

linux下创建文件与目录时默认被赋予了什么样的权限&quest;当我们创建一个新的文件或目录的时候,他的默认权限是什么? umask--指定当前使用者在创建文件或目录的时候默认的权限值 [rootiZ288fgkcpkZ default]# umask [roo ...x86平台转x64平台关于内联汇编不再支持的解决x8…

SVG-不是图片的图片

SVG-不是图片的图片 导语&#xff1a; 可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff0c;SVG&#xff09;是基于可扩展标记语言&#xff08;XML&#xff09;&#xff0c;用于描述二维矢量图形的一种图形格式。SVG由W3C制定&#xff0c;是一个开放标准。另SVG还是…

LeetCode 1490. 克隆 N 叉树(DFS/BFS)

文章目录1. 题目2. 解题2.1 DFS2.2 BFS1. 题目 给定一棵 N 叉树的根节点 root &#xff0c;返回该树的深拷贝&#xff08;克隆&#xff09;。 N 叉树的每个节点都包含一个值&#xff08; int &#xff09;和子节点的列表&#xff08; List[Node] &#xff09;。 class Node …

奇数阶幻方 java_N(奇数)阶幻方-java实现代码

看完最强大脑&#xff0c;有一期是说N阶幻立方的&#xff0c;作为一个程序员&#xff0c;我的第一反应时我可以用程序实现&#xff0c;在此公布N(奇数)阶幻方的java实现代码&#xff1a;package com.lzugis.test;public class Practice {public static int[][] magicOdd(int n)…

NSDateFormatter设定日期格式

部分日期格式的总结&#xff1a; NSDateFormatter * dateFormatter [[[NSDateFormatter alloc] init]autorelease]; [dateFormatter setAMSymbol:"AM"]; [dateFormatter setPMSymbol:"PM"]; [dateFormatter setDateFormat:"dd/MM/yyyy hh:mmaaa"…

LeetCode 1265. 逆序打印不可变链表(递归)

文章目录1. 题目2. 解题1. 题目 给您一个不可变的链表&#xff0c;使用下列接口逆序打印每个节点的值&#xff1a; ImmutableListNode: 描述不可变链表的接口&#xff0c;链表的头节点已给出。 您需要使用以下函数来访问此链表&#xff08;您 不能 直接访问 ImmutableListNo…

zz面试题小结

如果搞过ACM的人&#xff0c;找工作的确很好找&#xff0c;基本微软、百度之类都可以很容易拿到offer&#xff0c;我不是算法牛人&#xff0c;没搞过ACM&#xff0c;没拿过什么奖&#xff0c;没进过什么实验室&#xff0c;水平一般&#xff0c;所以更能代表大众吧。 总结一些常…

java流的传递方式是_java中数据的传递方式到底是怎样的!

今天早上我了一道有关java的题。主要考点是考java中值得传递方式。之前我在javaoo里总结的是&#xff1a;基本数据类型中保存的是实际的值,引用数据类型保存的是被引用的内存地址&#xff0c;那么基本数据类型就是按值传递&#xff0c;引用数据类型就是按地址来传递的。(难道我…

LeetCode 408. 有效单词缩写

文章目录1. 题目2. 解题1. 题目 给一个 非空 字符串 s 和一个单词缩写 abbr &#xff0c;判断这个缩写是否可以是给定单词的缩写。 字符串 “word” 的所有有效缩写为&#xff1a; ["word", "1ord", "w1rd", "wo1d", "wor1&qu…

java 钩子线程_java-钩子线程

在线上Java程序中经常遇到进程程挂掉&#xff0c;一些状态没有正确的保存下来&#xff0c;这时候就需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法&#xff0c;可以注…