Mysql的基础架构大概可以分为两层,服务器层和存储引擎层,
服务器层对应上图前两个虚线框、存储引擎层对应第三个虚线框

服务层包含连接器负责连接线程处理,查询缓存,分析器和优化器等,还有一些内建函数,他们都是跨存储引擎层的

存储引擎层则负责数据的存储和提取。其模式是插件式的,具体实现由不同厂商提供。MySql 5.5.5版本后将InnoDB设置为默认的存储引擎

连接器

连接器负责管理访问数据库服务的连接。连接器负责与客户端建立连接、处理连接,和授权认证

在使用连接命令mysql或是navicat连接后,连接器需要检验身份,如何信息输入不正确将收到”Access denied for user”错误。如果认证通过,连接器会到权限表里查询该用户对应权限。之后连接所做的操作都会依赖此时得到的权限

查询缓存

连接建立后,如果使用的是select语句就会先走查询缓存。之前执行过的语句以key-value的方法缓存在内存中,key是查询语句,value是查询结果。如何在缓存中则直接返回,如果不在缓存中则走正常查询逻辑,然后将结果放入缓存

查询缓存在更新频繁的场景下不适用,因为有些查询缓存还没使用就有可能被后面的更新语句清空。(对一个表的更新会清空表上的所以查询缓存)

可以将参数query_cache_type设置为DEMAND将sql语句修改为不使用查询缓存,如果需要使用则需要加上SQL_CACHE

分析器

如何缓存查询不到,就要开始对sql语句进行解析了。分析器先进行词法分析、然后再根据MySql的语句规则进行语法分析。如果语句不满足MySql的语法将会提示”You have an error in SQL syntax”

优化器

在经过分析器处理后还要进行优化器处理。如果在表里有多个索引的时候,优化器会决定使用哪个索引来提升执行效率,如果sql语句里有表关联会根据表的连接顺序来判断执行效率。优化器可能有选错的情况

执行器

在经过优化器处理后,执行器会根据优化器选择的方案根据表的存储引擎定义调用相应的存储引擎接口来获取数据。但在这之前要先判断该连接对该表有没有查询的权限,没有则提示权限错误

如果该连接对要执行查询的表有权限,执行器会不断调用相应的存储引擎接口获取表的记录行。最后将所有满足条件的行返回给客户端

有些场景下执行器调用一次,但存储引擎层扫描了多行,则可能导致explain中rows结果出现的是预估值不是精确值

最后修改日期: 2019年7月29日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。