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时系统挂了,这个数据页将不完整,标记为损坏)然后再写到期所在表空间的相应位置。

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

  1. mysql 分析执行计划的效率_MySQL执行计划分析

    大家好,我是anyux.本文介绍MySQL执行计划分析. 作用 通过explain或desc命令将优化器选择后的执行计划截取出来,便于管理和判断语句的执行效率 获取执行计划 desc SQL语句 ex ...

  2. oracle sql 执行计划分析_Oracle SQL调优系列之看懂执行计划explain

    1.文章写作前言简介 SQL调优系列博客链接:SQL调优专栏 之前曾经拜读过<收获,不止sql调优>一书,此书是国内DBA写的一本很不错的调优类型的书,是一些很不错的调优经验的分享.虽然读 ...

  3. ORACLE 执行计划分析

    http://www.cnblogs.com/rootq/archive/2008/09/06/1285779.html ORACLE 执行计划分析 一.什么是执行计划 An explain plan ...

  4. MySQL慢查询与执行计划分析

    MySQL慢查询与执行计划分析 慢查询分析 执行计划分析 表结构分析 慢查询分析 查看是否开启慢日志: show variables like 'slow_query_log%'; +-------- ...

  5. java的tey语句return了_Java中try、finally语句中有return时的执行情况

    在Java中当try.finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家众说纷纭,有的说会执行,有的说不会执行,到底哪种说法正确,现在通过下面的例子 ...

  6. distinct多个字段mysql_MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用 ...

  7. c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?

    导航:网站首页 > C语言所有语句格式 C语言中的的if语句共有多少种格式? C语言所有语句格式 C语言中的的if语句共有多少种格式? 相关问题: 匿名网友: 1.if语句: if(Bool表达 ...

  8. MySQL(三)——SQL执行计划分析

    目录 一.SQL执行计划概述 二.explain字段详解 1.id 2.select_type 3.possible_keys 4.key 5. key_len 6.ref 7.rows 8.Extr ...

  9. oracle sql 执行计划分析_从Oracle数据库实验来看索引的常见执行计划

    概述 今天主要介绍下Oracle索引的常见执行计划: INDEX FULL SCAN:索引的全扫描,单块读,有序 INDEX RANGE SCAN:索引的范围扫描 INDEX FAST FULL SC ...

最新文章

  1. TensorFlow 发布新版本v1.9(附应用实践教程)
  2. 全球及中国水产加工市场消费潜力分析与投资规模建议报告2022版
  3. CUDA程序优化技巧
  4. 如何:在Maven项目(JUnit,Mockito,Hamcrest,AssertJ)中测试依赖项
  5. Python List insert()方法
  6. PE下如何安装 安装版系统
  7. MYSQL小函数大用途之-------FIND_IN_SET
  8. Junipre认证必了解产品:juniper Networks SSG550M
  9. 梁勇:展望 2017年商业智能BI 发展的趋势
  10. spring boot session超时设置
  11. php代码写一串新年祝福,新年祝福QQ留言代码_把幸福装的满满的
  12. 利用EDA技术进行电子系统的设计有什么特点?
  13. 电信网络知识中的一些中英文简称对应表
  14. 厚物科技PXIe机箱PXI机箱PXIe便携机HW-1693BAT
  15. 相见恨晚,真的很喜欢Udacity
  16. 这样是不是就能把系统设计好??
  17. 电脑设置U盘启动快捷键
  18. 关于Android Framework渲染机制,你需要学习哪些?
  19. 企业落地级jmeter性能测试,结果分析以及报告(4-3)
  20. 【OpenPrompt】源码学习笔记

热门文章

  1. Uva 201 Squares (暴力 + 枚举)
  2. hdoj 1285 确定比赛名次 【拓扑排序】
  3. The Everyman's Guide to How Network Packets Are Routed Across the Web
  4. Linux安全基础:grep命令的使用
  5. 行先知 为您的办公室管理提供方便
  6. Andorid 反编译App
  7. vector的内存释放
  8. wat java_并发工具优于wati、notify(69)
  9. 聚类算法——Birch详解
  10. 1核2G云服务器 标准型S4 S5,腾讯云服务器标准型S4和S5配置性能参数区别及选择攻略...