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’;
-- 查看当前用户的权限
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%";
-- 监控查询缓存的命中率:
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 版本开始成为了默认存储引擎(创建表的时候)。