mysql分为sever层和存储引擎层:
- sever层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
- 存储引擎层负责数据的存储和提取,使用的是插件式,可支持innodb、memory、myisam等
(1)连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接
相关命令/参数
①wait_timeout
:连接器保持和客户端空闲连接时间,超时会断开
②show processlist
:显示用户运行线程
思考
①为什么推荐使用长连接?
- 建立连接的过程通常比较复杂
②推荐使用长连接,但如何解决长连接内存占用太大问题?
- 定期断开长连接
- MySQL 5.7 及以上,可以在每次执行一个比较大的操作后,通过执行
mysql_reset_connection
来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
(2)查询缓存(MySQL 8.0 版本已去掉查询缓存)
思考
①为什么不推荐使用查询缓存?查询缓存适用场景?如何按需使用缓存?
- 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空
- 适用场景:静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存
- mysql8.0以前可以按需使用缓存:
select SQL_CACHE * from T where ID=10;
(需要将query_cache_type
设置成 DEMAND)
query_cache_type=0/OFF
:关闭查询缓存。
query_cache_type=1/ON
:开启查询缓存。
query_cache_type=2/ DEMAND
:当使用 SELECT SQL_CACHE会开启缓存
(3)分析器
词法分析(sql中每个字符串代表什么)
语法分析(sql是否符合mysql语法)
(4)优化器
确定使用什么索引,怎么进行连接表等,最终确认一个执行方案
思考
①优化器是怎么选择索引的,有没有可能选择错?
- 根据扫描行数、是否排序、是否使用临时表、是否回表等
(5)执行器
慢查询日志中
rows_examined
的字段,表示这个语句执行过程中扫描了多少行。这个值是在执行器每次调用引擎获取数据行的时候累加的。
在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined
并不是完全相同的
思考
①有索引和无索引执行器的执行流程?(以select * from T where ID=10
为例)
- 扫描满足的行与全表扫描再判断的区别(这个过程是执行器调用引擎接口执行的)
参考:
[1]极客时间