尼恩说在前面
Mysql 有几级缓存?每一级缓存,具体是什么?
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取
本文目录
- 尼恩说在前面
- 一、MySQL缓存机制概述
- 二、MySQL 整体架构
-1. 解析器(Parser)
-2. 优化器(Optimizer)
-3. 执行器(Executor)
-三个核心组件之间的交互流程
- 三:一条完成的sql查询语句 执行流程 ,如下所示:
- 四:MySQL 8.0 版本为何移出了二级缓存(Query Cache)?
- 五:MySQL 8.0 版本前的二级缓存配置
-可以通过下面的步骤,进行二级缓存配置
-代码解释
- 六:使用应用层的缓存作为 外置缓存
- 尼恩架构团队的塔尖 sql 面试题
- 说在最后:有问题找老架构取经
一、MySQL缓存机制概述
二、MySQL 整体架构
解析器(Parser) 优化器(Optimizer) 执行器(Executor)。
1. 解析器(Parser)
SQL 词法分析:解析器首先对 SQL 语句进行词法分析,将 SQL 语句分割成多个“单词”或“标记”,如表名、列名、关键字等。 语法分析:接着,解析器会根据 SQL 语法规则生成对应的解析树(Parse Tree),用来描述 SQL 语句的逻辑结构。这个过程检查 SQL 语句的语法是否正确。 语义分析:确认 SQL 语句中涉及的数据库对象是否存在(比如表名、字段名是否有效),并且检查权限。
2. 优化器(Optimizer)
逻辑优化:优化器会对 SQL 语句进行逻辑优化,比如 SQL 语句重写、消除冗余操作、合并重复条件、重新排列 WHERE 子句中的条件等。 物理优化:在物理优化阶段,优化器会选择最优的访问路径和执行顺序。例如,它会决定使用哪种索引(如果有多个索引可选),是否做全表扫描,如何连接多张表(选择嵌套循环、哈希连接或排序合并连接等)。 成本估算:优化器会基于数据库的统计信息(例如表的大小、索引的选择性等)来估算不同执行计划的成本,选择代价最低的执行方案。
3. 执行器(Executor)
权限检查:在执行之前,执行器会首先检查用户是否有权限执行相应的操作。如果没有权限,则返回错误信息。 执行执行计划:执行器根据生成的执行计划,依次调用存储引擎的接口来执行具体的操作。例如,如果是查询操作,执行器会调用存储引擎来读取相应的数据;如果是插入操作,执行器则会调用存储引擎来插入数据。 结果返回:执行器根据查询的结果,将数据以合适的格式返回给客户端。如果涉及多个步骤(如 JOIN 操作),执行器会协调各个步骤的执行,并组合最终的结果集。
三个核心组件之间的交互流程
解析器:SQL 语句转换为解析树。 优化器:生成最优的执行计划。 执行器:根据计划调用存储引擎执行操作并返回结果。
三:一条完成的sql查询语句 执行流程 ,如下所示:
客户端请求: 客户端(如应用程序)向MySQL服务器发送SQL查询请求。 解析器: MySQL服务器接收到SQL查询后,首先由解析器进行解析,检查SQL语句的语法是否正确。 优化器: 解析完成后,优化器会根据查询语句和数据库的元数据(如表结构、索引等)生成一个或多个执行计划。 权限检查: 服务器检查执行该查询的用户是否有相应的权限。 缓存查询: 在某些情况下,如果查询可以被缓存,服务器会检查一级缓存(如InnoDB缓冲池)和/或二级缓存(如果启用了查询缓存)。 二级缓存(查询缓存,MySQL 8.0之前):如果查询缓存启用,服务器会检查查询缓存中是否有该查询的结果。如果有,直接返回缓存结果。 执行器: 如果查询没有在缓存中找到,执行器会根据优化器生成的执行计划执行查询。 执行过程中,可能会涉及到数据的读取和写入操作,此时二级缓存(InnoDB缓冲池)会更新。 一级缓存(InnoDB缓冲池):如果查询涉及到的数据或索引页已经在缓冲池中,可以直接使用,无需访问磁盘。 Buffer Pool 中,如下图所示: 返回结果: 查询执行完成后,结果集被返回给客户端。 更新缓存: 对于写操作(如INSERT、UPDATE、DELETE),相关的缓存(一级缓存和查询缓存)需要被更新或失效,以保持数据的一致性。 日志记录: 服务器会记录查询的日志信息,如慢查询日志,用于后续的性能分析。 关闭连接: 查询完成后,客户端可以选择关闭与MySQL服务器的连接,或者保持连接以便于后续的查询。
四:MySQL 8.0 版本为何移出了二级缓存(Query Cache)?
应用层缓存:在应用代码中实现缓存逻辑,使用如Redis、Memcached等缓存系统。 持久化存储引擎缓存:利用InnoDB的缓冲池来缓存数据和索引。 其他存储引擎:如果需要查询缓存的功能,可以考虑使用支持查询缓存的存储引擎,如MyISAM(但MyISAM不支持事务)。
五:MySQL 8.0 版本前的二级缓存配置
可以通过下面的步骤,进行二级缓存配置
步骤 | 描述 | 代码 |
SET GLOBAL query_cache_type = 1; | ||
SET GLOBAL query_cache_size = 64 * 1024 * 1024; | ||
SELECT * FROM table_name; |
代码解释
SET GLOBAL query_cache_type = 1;
:启用查询缓存,1表示ON。SET GLOBAL query_cache_size = 64 * 1024 * 1024;
:设置查询缓存的大小,这里设置为64MB。SELECT * FROM table_name;
:执行查询,如果查询缓存中存在相同的查询,将直接从缓存中获取结果。
六:使用应用层的缓存作为 外置缓存
应用层缓存:在应用代码中实现缓存逻辑,使用如Redis、Memcached等缓存系统。 本地缓存:对与热点数据,可以是用本地缓存对数据进行cache。
尼恩架构团队的塔尖 sql 面试题
sql查询语句的执行流程:
索引
索引下推 ?
索引失效
MVCC
binlog、redolog、undo log
mysql 事务
分布式事务
mysql 调优
说在最后:有问题找老架构取经
空窗1年/空窗2年,如何通过一份绝世好简历, 起死回生 ?
空窗8月:中厂大龄34岁,被裁8月收一大厂offer, 年薪65W,转架构后逆天改命!
空窗2年:42岁被裁2年,天快塌了,急救1个月,拿到开发经理offer,起死回生
空窗半年:35岁被裁6个月, 职业绝望,转架构急救上岸,DDD和3高项目太重要了
空窗1.5年:失业15个月,学习40天拿offer, 绝境翻盘,如何实现?
100W 年薪 大逆袭, 如何实现 ?
100W案例,100W年薪的底层逻辑是什么? 如何实现年薪百万? 如何远离 中年危机?
如何 评价一份绝世好简历, 实现逆天改命,包含AI、大数据、golang、Java 等
实现职业转型,极速上岸
关注职业救助站公众号,获取每天职业干货
助您实现职业转型、职业升级、极速上岸
---------------------------------
实现架构转型,再无中年危机
关注技术自由圈公众号,获取每天技术千货
一起成为牛逼的未来超级架构师
几十篇架构笔记、5000页面试宝典、20个技术圣经
请加尼恩个人微信 免费拿走
暗号,请在 公众号后台 发送消息:领电子书
如有收获,请点击底部的"在看"和"赞",谢谢