MySQL版本基于 5.7
MySQL各个组件的组成以及运行流程介绍
-
客户端
MySQL连接的客户端,列举几种常用的客户端工具- MySQL命令行
- navicate
…
-
服务端
介绍:主要包括连接器、查询缓存、语法解析器、优化器、执行器,以及常用的函数 例:视图,触发器、存储过程,MySQL核心数据服务都在这一层实现。-
连接器介绍:
1.和客户端建立连接
2.连接器中会有一块缓存存储用户连接时的权限信息,并根据权限信息进行用户权限设置,注意这里在用户更改了权限信息之后不会触发缓存的更新,必须要由连接断开重连后才能使用新的权限信息,可以由用户进行重连也可以在连接超时后自动断开后下次连接。
使用 show processlist 命令可以查看当前MySQL的连接数以及连接状态(command列)
客户端如果长时间不发送command到server端,连接器会主动东断开连接,默认没有command的最大等待时间为8小时。3.长短连接 开发中常用的是长连接,建立一次连接后后面会一直使用这个通道进行数据操作。而短连接则是每次访问数据库都建立一次连接。开发中一般使用连接池进行长连接的管理。但是当长连接时间执行过多的sql时也会产生较大连接对象占用内存,这时就需要我们进行定期的断开长连接。或者执行mysql_reset_connection 进行连接的资源重置,此操作不会刷新的权限内存也不会重新连接。
-
buffer (查询缓存)
MySQL server层面的的一块缓冲区,其结构类型类似于Map<k,v> k存储的是sql语句 v存储的是sql执行的结果,当sql进入执行器时会先到查询缓存中查找是否存在,存在则直接返回结果。否则进入连入连接器执行下面的操作。再把操作执行完的内容放入查询缓存信息执行以下语句查询缓存信息。
show status like'%Qcache%';
需要注意的是,当一个表的数据被进行了修改,查询缓存中的这个表的数据都会被清空,因此查询缓存使用在读多写少的表更合适如配置表。另外 mysql8.0中已经移除了查询缓存
-
词法解析器:词法解析器 借鉴这篇文章
-
优化器:优化器是解析sql语句时帮我们选择使用哪个索引执行sql语句,能达到最高的效率,领外也对我们的sql 本身进行优化 例如优化我们的最左前缀原则 例
联合索引为 name,age,position 伪sql写为select * from tablename where age ='' and name ='' and position='';
优化器会帮我们优化为
select * from tablename where name ='' and age ='' and position='';
自动排序索引字段
-
执行器:优化器执行完后MySQL会根据表名进行权限检查,通过才能放行,对于查询缓存的sql语句在返回结果之前也会进行权限校验。
-
-
引擎层
- 引擎层则是由插拔式的设计
- 引擎层执行流程
例如我们有一张test表,要查询这个表id为5的数据,id字段没有索引
1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 5,如果不是则跳过,如果是则将这行存在结果集中。
2. 调用重复的逻辑进行判断直到表扫描结束。
3. 执行器会将结果集返回给客户端。