一条select语句的执行过程
连接器
连接器要做的工作就是:
- 与客户端进行TCP三次握手连接
- 校验客户端的用户名和密码,如果用户名或者密码不对,就会报错
- 如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读到的权限(连接建立成功权限被修改也不会影响)
- 如何查看MySQL服务被多少个客户端连接
show processlist;
-
空闲连接的最大连接时长是8个小时
-
MySQL中的长连接累计很多,将会导致MySQL服务占用内存太大,可能会发送MySQL服务重启现象,如何解决呢?
- 定期断开长连接
- 客户端主动重置连接
查询缓冲
客户端向MySQL发送SQL语句,MySQL收到SQL语句后,就会解析SQL语句的第一个字段,看是什么类型的语句。
如果是查询语句,MySQL就会先去查询缓存中查找缓存数据,看看之前有没有执行过这一条命令,查询缓存是以key-value形式保存在内存中的,key是SQL语句,value是查询结果。
由于查询缓存命中率很低,在MySQL8.0开始之后的版本,将这个功能删除了
解析SQL
正式执行SQL语句前,MySQL会把SQL语句交给解析器做解析。
- 进行词法分析,根据输入的字符串识别出关键字
- 进行语法分析,根据词法分析的结果,语法解释器根据语法规则,判断SQL语句是否满足MySQL语法,准确无误后会构建语法树,方便获取SQL类型,表名,字段名,where条件等
执行SQL
执行SQL可分为三个阶段,预处理阶段、优化阶段、执行阶段
预处理器
- 检查SQL查询语句中的表或者字段是否存在(MySQL 5.7 判断表或字段是否存在的工作,是在词法分析&语法分析之后,prepare 阶段之前做的)
- 将
select *
中的*
符号,扩展为表上的所有列
优化器
优化器负责将SQL查询语句的执行方案确定下来,例如使用那个索引会更快,来决定使用那个索引
在查询语句前面加个explain命令,就会输出这条SQL语句的执行计划,可以下面则显示的是是用的那个索引,如为null则为全表扫描
执行器
优化器确定了执行方案后,SQL的执行交由执行器完成,执行器会调用存储引擎的api进行交互,最后从存储引擎读取记录,返回给客户端并写入缓存记录;
Innodb与MyISAM存储引擎的区别
使用show engines;
可查看MySQL支持的存储引擎
InnoDB是MySQL5.5及后续版本默认的事务型引擎,MyISAM是5.5之前的默认存储引擎