图片来自Mysql实战45讲01

详细解释
- Mysql 分为Server层和存储引擎层。
- Server层包括连接器、分析器、优化器和执行器,涵盖大多数核心功能,以及所有内置函数,所有跨存储引擎的功能都在这一层,比如存储过程、触发器、视图。
- 存储引擎层负责数据的存储和提取,是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。(5.5.5版本开始默认InnoDB)
- 不同存储引擎共用一个Server层
Server层
连接器
- 连接数据库时处理请求的就是连接器,负责跟客户端建立连接、获取权限、维持和管理连接。
- 连接命令
mysql -h$ip -P$port -u$user -p
- 当用户名和密码认证通过后,连接器会到权限表查出该用户拥有的权限,之后,此连接的权限判断逻辑,都以此时为准。
- 数据库里面长连接指连接成功后,若客户端一直有请求,则使用同一个连接;短连接时指每次执行完很少的几次查询就断开连接,下次查询再重新建立连接。
- 建立连接过程比较复杂,建议尽量使用长连接。
- 但是长连接多了会导致内存占用太大,可以考虑定期断开长连接,或者程序判断执行了一个占用内存过大的查询后,进行断开;
- 如果是5.7或更高版本,可以在执行一次比较大操作后,执行
mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
查询缓存
- mysql拿到查询请求后,会先到查询缓存看看是否执行过这个语句,之前执行的语句可能会以k-v形式存在内存中。k是查询语句,v是查询结果。如果有则直接返回(返回前会做权限验证)。
- 如果没有命中,则会执行后续操作,并将结果放到缓存中。
- 缓存的失效和更新频率有关,只要有对该表的更新,该表相关查询缓存都会被清空。
-
query_cache_type 设置成 DEMAND,表示查询语句默认不用缓存,确定要使用缓存的可以使用SQL_CACHE显式指定,语法SELECT SQL_CACHE * FROM TABLE。
- 8.0版本开始不再支持查询缓存。
分析器
- 没有命中缓存,则开始真正执行。
- 分析器先进行词法分析,识别里面的关键字,如SELECT。表名、列名等(没有表没有列时会报错)。
- 然后进行语法分析,判断是否符合mysql语法。
优化器
- 有多个索引时,决定使用哪个索引。或者有JOIN时,决定表连接顺序。
- 如
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20 既可以先从t1中取c=10的行,根据ID关联到t2,然后判断t2.d是否等于20;也可以先从t2取d=20的行,根据ID关联到t1,再判断t1.c是否等于10。
执行器
- 开始执行前,先判断对该表是否有查询权限。
- 执行时,调用存储引擎提供的接口,如
取表的第一行,判断ID值是不是10;取下一行,执行相同判断。最后将所有满足条件的行组成的结果集返回给客户端。
- 如果有索引,则
取表的第一行,判断ID值是不是10变为调用存储引擎接口取满足条件的第一行;取下一行,执行相同判断变为调用存储引擎接口取满足条件的下一行。
相关文章:
-
2021-11-09
-
2022-12-23
-
2021-11-20
-
2021-11-09
-
2021-04-01
-
2021-10-03
-
2021-06-10
-
2021-03-29
猜你喜欢
-
2021-08-06
-
2021-09-20
-
2021-12-25
-
2021-06-14
-
2022-02-07
-
2022-12-23
-
2021-08-11
相关资源
-
下载
2023-01-07
-
下载
2021-06-06
-
下载
2021-06-05