MySQL的SQL语句执行过程
MySQL中SQL执行原理
1.JDBC与MySQL连接
JAVA中的连接驱动JDBC与mysql的连接池进行连接,连接通道是一个半双工,接收到完整语句之后,才能给对方返回数据。
2.MYSQL
1. 查询缓存
在5.7及之前的版本,有一个查询缓存,是Map结构,key是sql语句,vvalue是查询结果,如果查询到结果,就直接返回数据。但是由于命中率低,8.0版本已经删除
2. SQL解析器
首先用sql_lex.cc词法分析器把sql语句进行切分为各种Token词,分成关键词和非关键词;
然后用sql_yacc.cc语法分析器把sql语句解析成语法树,在这个阶段进行sql语句关键字的正确性验证,关键字,关键字顺序。
3. 预处理器
经过sql解析器的关键字验证后,提交sql模板语句,再提交参数进行执行,模板一样的多次提交参数就行,提高效率,在这个过程中进行语法验证,表和列是否存在,别名歧义验证等等
4. SQL优化器
使用基于成本的优化器CBO,选择一个成本最小的执行路径作为执行计划。成本是指根据数据表,数据量和索引信息等,算出IO成本消耗值和CPU成本消耗值。
在优化器内部,根据定义的众多“优化规则”来进行优化处理,诸如关联查询重排、索引优选、连接查询重组、优化排序,优化min/max等函数、提前终止查询、等价变换等等。
5. 执行计划
执行器根据执行计划,从InnoDB中调用Handler API来进行数据的读写。
6. 结果返回
执行完毕后,通过TCP协议将结果返回客户端,如果有查询缓存会更新缓存
InnoDB中执行过程
读指令
先通过“自适应哈希索引”在Buff Pool中进行查找并返回,如果没有找到,就通过“预读方式”从磁盘表空间中记载。Buff Pool会通过free链表、flush链表、LRU链表三个链表来管理这些数据页的写入位置、刷盘位置以及数据页淘汰。会执行多个读来找到最终数据,如果建立了索引,会让次数变少
写指令
- 先写入负责事物回滚的Undo Log(磁盘),然后把数据记录写入Redo Log Buffer(内存),同时根据一定的规则刷到磁盘Redo Log(磁盘)中,保证断电恢复后能刷入数据。
- Log写完之后,把数据写入BUffer Pool。根据一定规则,看是否写入“变更缓存Change Buffer”中,之后再某些时机合并到Buffer Pool。
- 真实数据进入Buffer Pool后,就要找机会把真实数据刷到磁盘中,为了保证页的完整传输,先把数据写入Double Write Buffer,同时写到系统表空间的Double Write中,这是为了保证当断电时,也可以通过Double Write恢复。
- 最后把真实数据刷到磁盘中完成“写”指令。
其他模块
内存中的“锁信息区”——锁信息、“数据字典区”——字典信息、“Addiitional Memory Pool”——内部共享信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南