这个系列是学习极客时间《MySQL 实战 45 讲》的笔记,希望有所帮助,同时建议大家直接阅读原作。
大体上说 MySQL 可以分为 Server 层和存储引擎层两部分。
MySQL简要分层- Server 层:包括连接器、查询缓存、分析器、优化器 和 执行器 等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如 日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
- 存储引擎层:负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5 版本开始成为了默认的存储引擎。
从图中可以看出,Server 层是统一的,存储引擎可以有多个。
1、连接器
负责和客户端建立连接、获取权限、维持和管理连接。
可以通过 show processlist
命令查看所有的连接。
因为建立连接比较复杂,为提高性能,建议使用长连接。
另外MySQL在执行过程中用到的临时内存是管理在连接对象中的,及时释放和重新初始化连接能有效降低MySQL内存占用。
2、查询缓存
MySQL 在拿到查询语句后,会先到查询缓存查看是否执行过,如果能找到(语句作为key,结果作为value),则直接返回查询结果。
如果不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存。
看似效率很高,但是非特定场景建议不要使用查询缓存。
查询缓存的失效会非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会失效。对于写多读少的场景不适用,除非有一张静态表,很少更新的那种场景。
可以通过 query_cache_type
来设置是否全局启用。对于确定要使用查询缓存的语句,可以用 SQL_CACHE
显式指定,如:
mysql> select SQL_CACHE * from T where ID = 10;
另外,MySQL 8.0 版本直接将查询缓存模块去掉了,也意味着上述设置在 MySQL 8.0 版本不能使用。
3、分析器
没有命中缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什么,因此要对SQL语句进行解析。
先做词法分析,识别出SQL语句里面的字符串分别是什么,代表什么。
再做语法分析,会根据语法规则,判断这个SQL语句是否满足MySQL语法。
如果语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。
4、优化器
经过了分析器,MySQL 就知道要做什么了。在开始执行前,还要经过优化器的处理。
- 在表里面有多个索引的时候,决定使用哪个索引
- 一个语句有多表关联的时候,决定各个表的连接顺序
优化器阶段完成后,这个语句的执行方案就确定下来了,然后会进入执行器阶段。
5、执行器
MySQL 通过分析器知道要做什么,通过优化器知道要怎么做,接下来就是执行阶段。
- 先判断当前连接是否有查询的权限,如果没有就会返回没有权限的错误。
xxx command denied to user xxxxx
- 有权限,就打开表继续执行。查询所有满足条件的行组成的记录作为结果集返回给客户端。
网友评论