MySQL的基本架构
2019-05-28 本文已影响10人
秋慕云
一、MySQL的架构图:
MySQL基本架构图从上图可以看出:
-
Server层包括:连接器,查询缓存,解析器,预处理器,优化器,执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器和视图等。
-
存储引擎层包括:InnoDB、MyISAM、MEMORY等
-
不同的存储引擎共用同一个Server层
二、组件介绍
1. 连接器
- 负责跟客户端建立连接,获取权限,维持和管理连接
- 用户名密码验证通过后,连接器会到权限表中查询用户的权限,之后这个链接里面的权限判断逻辑,都依赖于此时读取的权限;即使使用管理员账号对用户权限作修改,也不会影响已存在的连接的权限
- 参数wait_timeout控制服务器保持与客户端的空闲连接的时长,默认值为8小时
- 长连接积累导致MySQL占用内存飞涨
考虑定期断开长连接
MySQL5.7以后,执行mysql_reset_connection来重新初始化连接资源 (此过程不需要重连和重现验证权限,但是会将连接恢复到刚创建完成的状态)
2. 查询缓存
-
如果查询恰好命中查询缓存,那么查询不会被解析,执行计划不会被生成,在返回查询结果之前,MySQL会检查用户的权限
-
对一张表的更新,会导致这张表的查询缓存被清空(查询缓存失效频繁,弊大于利)
-
推荐按需使用查询缓存,设置参数query_cache_type设置成DEMAND,默认情况下,SQL不使用查询缓存,通过SQL_CACHE显示指定使用查询缓存,如下SQL:
SELECT SQL_CACHE * FROM user_info WHERE id = 1;
- MySQL 8.0已经将查询缓存整块功能删除掉
3. 解析器
- 词法分析,识别SQL中的字符串是什么
- 语法分析
a.在词法分析的基础上,根据语法规则,判断SQL是否满足MySQL语法,最后得到一棵语法树
b.对于只是参数不同,其他均相同的sql,它们执行时间不同但硬解析的时间是相同的;而同一SQL随着查询数据的变化,多次查询执行时间可能不同,但硬解析的时间是不变的
4. 预处理器
- 根据MySQL规则,进一步检查语法树是否合法,比如检查表、数据列是否存在;别名是否有歧义等等
5. 优化器
- 优化器会将语法树转化成执行计划(可以生成多个执行计划),然后找出最合适的执行计划(成本最少)
- 可以通过Last_query_cost得知查询的成本
如下SQL:
// 先执行查询语句
SELECT * FROM user_info WHERE age > 28;
// 然后执行成本查看语句
show status like 'Last_query_cost'; // 结果中的value表示,优化器认为这条SQL大概需要查多少个数据页的随机查找才能完成查询
- 可以请求优化器解析优化过程的各个因素(explain sql)
- 在表里面有多个索引的时候,决定使用那个索引
- 通过特殊的关键字提示优化器,可以影响优化器的决策过程(例如:for index)
- 优化器阶段完成后,执行计划就确定下来了
- 优化器有时候会选择错误的执行计划:a.索引统计信息不准 b.优化器理解的最优执行计划不一定是响应最快的执行计划
【参考文献】
MySQL学习笔记 - 1 - 基本架构与日志两阶段提交