type
status
date
slug
summary
tags
category
icon
password
MySQL可以分为Server层和存储引擎层
- Server层
- 包括:连接器、查询缓存、分析器、优化器、执行器等
- 涵盖 MySQL的大多数核心服务功能
- 所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实 现
- 比如:存储过程、触发器、视图等
- 存储引擎层
- 负责数据的存储和提取
- 可插拔式存储引擎:InnoDB、MyISAM、Memory 等
- 最常用存储引擎是InnoDB
- 从MySQL 5.5版本开始,默认是InnoDB

- 连接到数据库
- 连接完成后,如果你没有后续的动作,这个连接就处于空闲状态。客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的默认值是 8 小时。
- 查询缓存
- 查询缓存默认是关闭的状态
- 不建议使用(MySQL 8.x 版本直接将查询缓存的整块功能删掉了)
- 成本高:查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清 空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。
- 命中率不高:对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一 张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
- 功能并不如专业的缓存工具更好:redis、memcache、ehcache...
- 分析SQL语句
- 词法分析:词法分析就是把一个完整的 SQL 语句分割成一个个的字符串
- 语法分析:语法分析器根据词法分析的结果做语法检查,判断你输入的SQL 语句是否满足 MySQL 语法。(数据结构:解析树)
- 预处理器:预处理器则会进一步去检查解析树是否合法,比如表名是否存在,语句中表的列是否存 在等等,在这一步MySQL会检验用户是否有表的操作权限。(预处理之后会生成新的解析树,然后调用对应执行模块)
- 优化SQL语句
- 对查询进行优化。作用是根据解析树生成不同的执行计划,然后选择最优的执行计划。
- 当有多个索引可用的时候,决定使用哪个索引;
- 在一个语句有多表关联(join)的时候,决定各个表的连接顺序,以哪个表为基准表。
- 执行SQL语句
- 判断执行权限
- 调用存储引擎接口查询
- c_id是主键执行流程:
- 调用 InnoDB 引擎接口,从主键索引中检索c_id=14的记录。 主键索引等值查询只会查询出一条记录,直接将该记录返回客户端。
- c_id不是主键执行流程:全表扫描
- 调用 InnoDB 引擎接口取这个表的第一行,判断c_id 值是不是 14,如果不是则跳过,如果是 则将这行缓存在结果集中;
- 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
- 执行器将上述遍历过程中所有满足条件的行组成的结果集返回给客户端。
- 作者:wwwanchengfei
- 链接:https://www.wanchengfei.com//article/sql-execution
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。