一、Mysql的逻辑架构图
大体上Mysql可分为Server层和存储引擎层两部分。
- Server层:
主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 - 存储引擎层
主要负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
二、下面是各个组件的作用
- 连接器
这是连接到数据库上的第一关,用的是TCP方式,然后认证身份,接下来会查询连接用户的权限供当前Session使用。如果中途修改了用户权限,也会在新的连接session才会生效。
连接完成后,没有后续动作,则该连接就会变成空闲连接。
可以用show processlist
看到:
mysql> show processlist;
+----+------+----------------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+----------------+------+---------+------+-------+------------------+
| 3 | root | localhost:9885 | NULL | Query | 0 | NULL | show processlist |
| 4 | root | localhost:9908 | NULL | Sleep | 46 | | NULL |
+----+------+----------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
其中的Command列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。
客户端如果长时间没活动,连接器就会将它自动断开,这个时间由wait_timeout控制的,默认值是8个小时。
-
查询缓存
连接建立完成后,执行查询语句,mysql会先在缓存中查找,之前执行过的语句及结果可能会在内存中以key-value对的形式缓存着,如果有则会直接返回结果。
缓存的弊端就是只要表更新过,那么关于这个表的所有缓存就会被清空,如果表更新的比较频繁,反而会增加数据库压力,需要注意的是,Mysql 8.0版本直接将查询缓存的整块功能删除掉了。 -
分析器
mysql 将查询语句分析识别,此时发现语法有误就会报错。 -
优化器
在真正的SQL执行之前,还要经过优化器,决定该查询使用哪个索引,或者决定表的连接顺序等等 -
执行器
开始执行前,先判断一下对这个表有没有查询的权限,然后才开始查询。
执行where条件查询时,如果该字段没有索引,就会逐条遍历。
---------------------------------------------------- 完----------------------------------------------------