开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
执行select语句的过程
Mysql的结构
首先要明白Mysql的架构
Mysql的架构分为两个部分,Server层和存储引擎层
-
Server层:
- 负责建立连接,分析和执行sql
- Mysql大部分核心功能模块都在这里实现。主要包括连接器、解析器、预处理器、优化器、执行器等
- 所有的内置函数和所有跨存储引擎的功能(储存过程、触发器、视图等)都在这里实现
-
储存引擎:负责数据的储存和提取
select执行流程
1、连接器
主要负责:建立连接、管理连接、校验用户身份
首先要连接Mysql服务,执行sql语句。连接的过程要经过TCP三次握手,Mysql是基于TCP协议传输的。
可以通过show processlist查看mysql被多少个客户端连接。一个已经建立起来的连接,管理员也无法修改权限
Mysql可以设置最大空闲连接的时长,通过wait_timeout参数控制,默认是8小时。通过Max_Connections控制最大连接数
Mysql也和http一样,有长连接和短连接的区别。使用长连接可能导致占用内存改变多,Mysql在执行过程中临时使用内存管理连接对象。这些连接资源只有在连接断开后才会被释放,如果占用内存过大。有可能会被系统搞强制kill,然后Mysql进行重启。解决方法有两个:
- 定期释放长连接
- 客户端主动重置连接,调用Mysql_reset_connection()函数重置
2、查询缓存
在建立连接之后,mysql会发送sql语句,然后会查询缓存,就是把sql语句当成key,然后查有没有对应的value。
但是这个缓存功能挺鸡肋的,只要表进行更新操作,那么缓存就要被清空,就没用了。
Mysql8直接删除了缓存的功能。对于8之前的版本,我们可以认为控制缓存是否打开,query_cache_type。
3、解析sql
在正式解析sql查询语句之前,Mysql会对sql词法、语法做解析,重构语法树,方便后续模块读取表名、字段、语句类型
-
词法解析:会解析关键字,构建sql语法树
-
语法解析:会判断输入的sql语句是否符合Mysql的语法
- 表不存在或者字段不存在并不是在解析器中做的
4、执行
执行每个select语句会主要经过三个阶段
-
预处理阶段:
- 检查表或者字段是否存在
- 将select * 中的 *扩展到所有列
-
优化阶段:优化器负责将sql查询语句的具体方案确定下来,选择代价最小的方案,比如选择索引方式
-
执行阶段:根据方案执行,从储存引擎读取数据,返回给客户端
主要有三种执行方案
- 主键索引查询:查询的字段是主键 Select id from t
- 全表扫描:这个字段没有索引,优化器决定进行一个全表的扫描,主要还是使用了主键索引进行查询Select name from t
- 索引下推:联合索引会优先判断联合索引列是否符合需要,实在不行才会回表查询,可以有效减少回表查询次数