巅峰战队|详解一条查询select语句和更新update语句的执行流程

  • 前言
  • 一条select语句的执行流程
  • 建立连接
  • 查询缓存
  • 解析器和预处理器
  • 词法解析和语法解析(Parser)
  • 预处理器(Preprocessor)
  • 查询优化器(Query Optimizer)
  • 优化器可以做哪些优化
  • 优化器并不是万能的
  • 优化器如何得到查询计划
  • 存储引擎查询
  • 返回结果
  • 一条update语句的执行流程
  • Buffer Pool
  • redo log
  • Write-Ahead Logging(WAL)
  • redo log是如何刷盘的
  • bin log
  • bin log和redo log的区别
  • update语句的执行流程
  • 两阶段提交
  • 假如不采用两阶段提交法
  • 宕机后的数据恢复规则
  • 总结
前言本文基于MySQL5.7版本 。
前面几篇MySQL系列的文章介绍了索引 , 事务和锁相关知识 , 那么今天就让我们来看看当我们执行一条select语句和一条update语句的时候,MySQL要经过哪些步骤 , 才能返回我们想要的数据 。
一条select语句的执行流程MySQL从大方向来说 , 可以分为 Server 层和存储引擎层 。 而Server层包括连接器、查询缓存、解析器、预处理器、优化器、执行器等 , 最后Server层再通过API接口形式调用对应的存储引擎层提供的接口 。 如下图所示(图片来源于《高性能MySQL》):
巅峰战队|详解一条查询select语句和更新update语句的执行流程在这里插入图片描述
根据流程图 , 一条select查询大致经过以下六个步骤:1、客户端发起一个请求时 , 首先会建立一个连接2、服务端会检查缓存 , 如果命中则直接返回 , 否则继续之后后面步骤3、服务器端根据收到的sql语句进行解析 , 然后对其进行词法分析 , 语法分析以及预处理4、由优化器生成执行计划5、调用存储引擎层API来执行查询6、返回查询到的结果
查询流程也可以通过如下图表示(图片来源于丁奇MySQL45将):
巅峰战队|详解一条查询select语句和更新update语句的执行流程在这里插入图片描述
建立连接第一步建立连接 , 这个很容易理解 , 需要特别指出的是MySQL服务端和客户端的通信方式采用的是半双工协议 。
通信方式主要可以分为三种:单工 , 半双工 , 全双工 , 如下图:
巅峰战队|详解一条查询select语句和更新update语句的执行流程在这里插入图片描述
  • 单工:通信的时候 , 数据只能单向传输 。 比如说遥控器 , 我们只能用遥控器来控制电视机 , 而不能用电视机来控制遥控器 。
  • 半双工:通信的时候 , 数据可以双向传输 , 但是同一时间只能有一台服务器在发送数据 , 当A给B发送数据的时候 , 那么B就不能给A发送数据 , 必须等到A发送结束之后 , B才能给A发送数据 。 比如说对讲机 。
  • 全双工:通信的时候 , 数据可以双向传输 , 并且可以同时传输 。 比如说我们打电话或者用通信软件进行语音和视频通话等 。
半双工协议让MySQL通信简单快速 , 但是也在一定程度上限制了MySQL的性能 , 因为一旦从一端开始发送数据 , 另一端必须要接收完全部数据才能做出响应 。 所以说我们批量插入的时候尽量拆分成多次插入而不要一次插入太大数据 , 同样的查询语句最好也带上limit限制条数 , 避免一次返回过多数据 。
MySQL单次传输数据包的大小可以通过参数max_allowed_packet控制,默认大小为4MB
SHOW VARIABLES LIKE 'max_allowed_packet';