一条sql的执行流程见下图:
连接器:
负责跟客户都建立连接、获取权限、维持和管理连接。
- 用户名、密码验证
- 查询权限信息、分配对应的权限
- 可以使用 show processlist 查看现有的连接
- 如果长时间没有动静,会字段断开连接,通过 wati_timeout 控制,默认 8 小时
查询缓存
- 当执行 sql 查询语句的时候,会先去查询缓存中查看结果,之前执行过的 sql 语句及其结果可能以 key-value 的形式存储在缓存中。如果能找到则直接返回,如果找不到则执行后边的阶段。
- 但是不推荐使用查询缓存----》 a、查询缓存失效比较频繁(只要表更新,缓存就会清空),频繁 IO 。b、缓存对应新更新的数据命中率比较地
分析器
- 词法分析:Mysql 需要把输入的字符串进行识别每个部分代表什么意思? 把字符串 T 识别成表名 T ;字符串 ID 识别成 列 ID
- 语法分析:根据语法规则判断这个 sql 语句是否满足mysql 的语法,如果不符合报错 “You have an error in your SQL synta”。
优化器
在具体执行 sql 语句之前,要先经过优化器的处理
- 当表中有多个索引时,决定用哪个索引
- 当sql 需要多表关联时,决定表的连接顺序
不同的执行方式对 sql 语句的执行效率影响很大
- RBO 基于规则的优化
- CBO 基于成本的优化
Redo log (事务日志) —— Innodb 存储引擎的日志文件
- 记录的是数据库中每个页的修改,可以用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置,因为修改会覆盖之前的)
- 当发生数据修改的时候,innodb引擎会先把记录写入 redo log 中,并更新内存,此时更新就算完成了。同时innodb引擎会在合适的时机将记录写到磁盘中
- Redo log 是固定大小的,是循环写的过程
- 有了 redolog之后,innodb 可以保证即使数据库发生异常重启,之前的记录也不会丢失,叫做 crash-safe
undo log (回滚日志) —— Innodb 存储引擎的日志文件
- undolog 保证事务的原子性,还用undolog日志实现多版本并发控制简称 MVCC
- 在操作数据库之前,先将数据备份到 undolog 文件中。然后进行数据的修改,如果出现错误或用户执行 ROLLBACK 语句,系统可以通过 undolog 中的备份数据恢复到事务开始之前的数据。
- undolog的执行逻辑可以理解为:
- 当 delete 一条记录时,undolog 记录一条对应的 insert 语句
- 当 insert 一条记录时,undolog 记录一条对应的 delete 语句
- 当 update 一条记录时,undolog 记录一条对应的返 update 语句
binlog (归档日志) —— 服务端日志文件
binlog主要用作主从同步和数据库基于时间点的还原。
Binlog 是 Server 层的日志文件,主要做mysql功能层面的事情,与 Redolog 的区别
- redolog 是innodb独有的,binlog 所有引擎都可以用
- redolog 是物理日志,记录数据页上的修改,binlog是逻辑日志,记录的是这个语句的原始逻辑
- redolog 是循环写的,空间会用完。binlog 是可以追写的,不会覆盖之前的日志信息