MySQL的SQL语句执行过程

MySQL中SQL执行原理

image
image

1.JDBC与MySQL连接

image
JAVA中的连接驱动JDBC与mysql的连接池进行连接,连接通道是一个半双工,接收到完整语句之后,才能给对方返回数据。

2.MYSQL

1. 查询缓存

image
在5.7及之前的版本,有一个查询缓存,是Map结构,key是sql语句,vvalue是查询结果,如果查询到结果,就直接返回数据。但是由于命中率低,8.0版本已经删除
image

2. SQL解析器

image
首先用sql_lex.cc词法分析器把sql语句进行切分为各种Token词,分成关键词和非关键词;
然后用sql_yacc.cc语法分析器把sql语句解析成语法树,在这个阶段进行sql语句关键字的正确性验证,关键字,关键字顺序。
image

3. 预处理器

经过sql解析器的关键字验证后,提交sql模板语句,再提交参数进行执行,模板一样的多次提交参数就行,提高效率,在这个过程中进行语法验证,表和列是否存在,别名歧义验证等等

4. SQL优化器

使用基于成本的优化器CBO,选择一个成本最小的执行路径作为执行计划。成本是指根据数据表,数据量和索引信息等,算出IO成本消耗值和CPU成本消耗值。
在优化器内部,根据定义的众多“优化规则”来进行优化处理,诸如关联查询重排、索引优选、连接查询重组、优化排序,优化min/max等函数、提前终止查询、等价变换等等。

5. 执行计划

执行器根据执行计划,从InnoDB中调用Handler API来进行数据的读写。
image

6. 结果返回

执行完毕后,通过TCP协议将结果返回客户端,如果有查询缓存会更新缓存
image

InnoDB中执行过程

image

读指令

先通过“自适应哈希索引”在Buff Pool中进行查找并返回,如果没有找到,就通过“预读方式”从磁盘表空间中记载。Buff Pool会通过free链表、flush链表、LRU链表三个链表来管理这些数据页的写入位置、刷盘位置以及数据页淘汰。会执行多个读来找到最终数据,如果建立了索引,会让次数变少

写指令

  1. 先写入负责事物回滚的Undo Log(磁盘),然后把数据记录写入Redo Log Buffer(内存),同时根据一定的规则刷到磁盘Redo Log(磁盘)中,保证断电恢复后能刷入数据。
  2. Log写完之后,把数据写入BUffer Pool。根据一定规则,看是否写入“变更缓存Change Buffer”中,之后再某些时机合并到Buffer Pool。
  3. 真实数据进入Buffer Pool后,就要找机会把真实数据刷到磁盘中,为了保证页的完整传输,先把数据写入Double Write Buffer,同时写到系统表空间的Double Write中,这是为了保证当断电时,也可以通过Double Write恢复。
  4. 最后把真实数据刷到磁盘中完成“写”指令。

其他模块

内存中的“锁信息区”——锁信息、“数据字典区”——字典信息、“Addiitional Memory Pool”——内部共享信息

posted @   zzzzzzzk  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示