SQL执行过程
最近一直在做系统的性能优化,同时也复习了一下mysql的知识,这里整理一下。
Mysql查询过程
这里忽略细节,简单介绍一下Mysql执行一条查询语句的基本过程。
组件介绍
- 缓存: 查询结果的缓存
- 解析器: 解析sql
- 优化器: 选择最优路径,生成执行计划
- 执行引擎: 判断用户与表的权限关系,执行查询
- 存储引擎 : 真正存储数据和索引的地方
流程描述
- 客户端发送一条查询语句给服务器
- 服务器从缓存中取,命中直接返回,没有命中则继续下一步
- 解析器解析SQL,预处理
- 优化器选择最优路径,生成执行计划
- 执行引擎根据执行计划,调用存储引擎的api执行查询
- 缓存查询结果并返回数据
查询细节
这里重点关注执行引擎与存储引擎的交互细节。因为开发同学很少会用到 Mysql中的缓存,解析器,优化器相关知识(其实是因为我暂时不了解)。
这里分两种情况来讨论执行引擎与存储引擎的交互细节
- 不走索引的查询过程
- 执行引擎调用存储引擎的API,返回一行数据的
- 执行引擎判断数据是否符合where条件,符合则加入结果集,否则就跳过
- 重复1,2两个步骤,直到存储引擎返回的数据为空(查询到最后一条数据了)
- 返回结果集
- 走索引的查询过程
- 执行引擎调用存储引擎的API
- 存储引擎从索引中筛选处符合条件的数据,取第一行(下一次请求取符合条件的下一行,依次顺序往下)
- 存储引擎判断是否需要回表,是则回表取出数据返回,否则直接返回数据行
- 执行引擎判断数据是否符合所有的where条件(如果部分条件不能走索引,还是需要在执行引擎中进行筛选),符合则加入结果集,否则就跳过
- 重复以上4个步骤,直到存储引擎返回的数据为空(查询到最后一条数据了)
- 返回数据集
执行引擎和存储引擎的区别
其实上面的流程已经足够理解执行引擎和存储引擎的区别了,简单总结一下。
- 执行引擎 是mysql自带的,不可替换,不可选择,负责sql的执行,通过api调用存储引擎,获取数据,并会进行数据的筛选与返回。
- 存储引擎 真正保存数据与索引的组件。有很多mysql可用的存储引擎可以选择,最广为人知的如InnoDB和MyISAM。可以在创建数据表的时候选择存储引擎。每个存储引擎有自己的实现方式,只需要提供符合Mysql规范的api即可。
参考资料:
《高性能Mysql》
《MySQL技术内幕-InnoDB存储引擎》