MySQL的内部组件结构
2021/12/20 2:20:44
本文主要是介绍MySQL的内部组件结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Server层
- 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
连接器
- mysql有非常多种类的客户端:navicat,mysql front,jdbc,SQLyog等非常丰富的客户端,这些客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是由连接器完成的。
- 连接器负责跟客户端建立连接、获取权限、维持和管理连接。
- 一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。用户的权限表在系统表空间的mysql的user表中。
- 连接到这个数据库上,这时候接待你的就是连接器。如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
- 连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,通过: show processlist 命令进行查看。
- 客户端如果长时间不发送command到Server端,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。
- 涉及到的命令命令:
-- 连接数据可以 mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306; -- 创建新用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; -- 赋权限,%表示所有(host) grant all privileges on *.* to 'username'@'%'; -- 刷新数据库 flush privileges; -- 设置用户名密码 update user set password=password(”123456″) where user=’root’; -- 查看当前用户的权限 mysql> show grants for root@"%"; -- 查看连接的状态 show processlist; -- 关闭连接 kill <id>;
查询缓存
- 大多数情况查询缓存就是个鸡肋!mysql8.0已经移除了查询缓存功能!
- 查询缓存往往弊大于利。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空
- 一般建议大家在静态表里使用查询缓存。如配置表、字典表....
- 设置查询缓存方式
# 找到mysql的配置文件:my.cnf # query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存 query_cache_type=2
- 查询缓存的常用命令
-- 查看当前mysql实例是否开启缓存机制 show global variables like "%query_cache_type%"; -- 监控查询缓存的命中率: mysql> show status like'%Qcache%';
- 段落引用 Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。
- Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。
- Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
- Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。
- Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。
- Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。
- Qcache_queries_in_cache:当前缓存中缓存的查询数量。
- Qcache_total_blocks:当前缓存的block数量。
分析器(java中类似的功能:Antlr4)
- 词法分析
- 语法分析
- 语义分析
- 构造执行树
- 生成执行计划
- 计划的执行
优化器
- 优化器是在表里面有多个索引的时候,决定使用哪个索引;
- 在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
执行器
- 开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误
- 如果有权限,就打开表继续执行。
Store(存储引擎)层
- 存储引擎层负责数据的存储和提取。
- 其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎(创建表的时候)。
这篇关于MySQL的内部组件结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15MySQL教程:初学者必备的MySQL数据库入门指南
- 2024-11-15MySQL教程:初学者必看的MySQL入门指南
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南