开发过程中经常使用mysql,比如进行记录查询。不过很多人不清楚类似,"select age from t_person where id=1" 是怎样执行的。下面为大家一起解剖这个问题。
一、mysql的架构
如上图,mysql分为Server层和存储引擎层。server层包括了mysql的大多数的核心服务、全部的内置函数以及跨存储引擎的功能(存储过程、触发器、视图)。而存储引擎层,则主要负责数据的存储以及提取,架构模式是插件式的(InnoDB、MyISAM等等),常用的是InnoDB这种存储引擎。
二、查询语句的执行流程
1、取得连接
使用mysql的连接器。连接器用于与客户端建立连接、获取用户权限、维持和管理连接。获取到权限后,在本次连接过程中,权限是不会被改变。
2、查询缓存
mysql接收到一个查询请求后,会先到查询缓存。key 为 SQL 语句,value 为查询结果,如果查到就直接返回。
不建议使用缓存,在 MySQL 8.0 版本已经将查询缓存删除,也就是说 MySQL 8.0 版本后不存在此功能。
3、分析器
分为词法分析和语法分析。此阶段只是做一些 SQL 解析,语法校验。所以一般语法错误在此阶段。此阶段是要干什么。
4、优化器
当表里有多个索引的时候,决定使用哪个索引;或者一个语句中存在多表关联的时候(join),决定各个表的连接顺序。此阶段确定该怎么做。
5、 执行器
开始执行语句。执行语句的时候还要判断是否具备此权限,没有权限就直接返回提示没有权限的错误;有权限则打开表,根据表的引擎定义,去使用这个引擎提供的接口,获取这个表的第一行,判断 id 是都等于 1。如果是,直接返回;如果不是继续调用引擎接口去下一行,重复相同的判断,直到取到这个表的最后一行,最后返回。
三、总结
一条简单的sql在MYSQL服务中需要完成上述五步才能正常得到结果。当中查询缓存这步骤,因其失效频繁(只要相关的表有更新,就会缓存记录就会被清空),因此不建议使用,甚至高版本的(8.0以后)查询缓存模块被删除了。