【八股消消乐】MySQL参数优化大汇总
😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法
等相关知识点,期待与你一同探索、学习、进步,一起卷起来叭!
目录
- 题目
- 答案
- MySQL体系结构
- SQL语句处理
- 内存调优
- MySQL 并发
题目
💬技术栈:MySQL
🔍简历内容:熟悉MySQL体系结构,了解SQL语句处理底层,熟悉常用的MySQL参数调优手段。
🚩面试问:你了解SWAP 页交换吗?InnoDB 的 IBP 的内存大小是有限的,它是如何将热点数据留在内存中,淘汰非热点数据的?
💡建议暂停思考10s,你有答案了嘛?如果你有不同题解,欢迎评论区留言、打卡。
答案
(1)SWAP 页交换:SWAP 分区在系统的物理内存不够用的时候,就会把物理内存中的一部分空间释放出来,以供当前运行的程序使用
。被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间的数据被临时保存到 SWAP 分区中,等到那些程序要运行时,再从 SWAP 分区中恢复保存的数据到内存中。
(2)MySQL基于LRU算法来实现淘汰非热点数据,但与我们熟悉的LRU算法不同的是,MySQL新增了一个midpoint insertion startegy策略
,就是默认情况下,读取到的新页并不是直接放入的LRU列表的首部,而是LRU列表长度的5/8处
,目的是为了避免由于一些不常查询SQL偶尔一次查询就把之前热点数据淘汰的情况
。
MySQL体系结构
MySQL体系结构分为四层:
(1)客户端连接器:数据库连接、授权认证、安全管理等
,该层引用了线程池,为接入的连接请求提高线程处理效率。
(2)Server 层:实现 SQL 的一些基础功能
,包括 SQL 解析、优化、执行以及缓存等。
(3)各种存储引擎:主要负责数据的存取
,例如 Buffer 缓存。
(4)数据存储层:负责将数据存储在文件系统中
,并完成与存储引擎的交互。
SQL语句处理
(1)查询语句
- 通过
第一层的连接和授权认证
。 - 将
SQL 请求发送至 SQL 接口
。 - SQL 接口接收到请求之后,会先检查查询
SQL 是否命中 Cache 缓存
中的数据,如果命中,则直接返回缓存中的结果;否则,需要进入解析器
。 - 解析器主要
对 SQL 进行语法以及词法分析
。 - 之后进入到
优化器
中,优化器会生成多种执行计划方案,并选择最优方案执行。 - 执行器检查连接用户是否有该表的执行权限,有则查看 Buffer 中是否存在该缓存,存在则获取锁,查询表数据;否则重新打开表文件,通过接口调用相应的存储引擎处理,这时存储引擎就会进入到存储文件系统中获取相应的数据,并返回结果集。
(2)更新语句
- 和查询语句差不多,只不过执行更新操作时多了一个
记录日志
的步骤。 - 执行更新操作时 MySQL 会将操作的日志记录到 binlog(归档日志)【这个步骤所有的存储引擎都有,
InnoDB 除了要记录 binlog 之外,还需要多记录一个 redo log(重做日志)
】- redo log 主要是为了解决 crash-safe 问题而引入的。
- crash-safe 问题:当数据库在存储数据时发生异常重启,我们需要保证存储的数据要么存储成功,要么存储失败,也就是不会出现数据丢失的情况。
- 执行更新操作时,首先会查询相关的数据,之后通过执行器执行更新操作,并将执行结果写入到内存中,同时记录更新操作到 redo log 的缓存中,此时 redo log 中的记录状态为 prepare,并通知执行器更新完成,随时可以提交事务。
- 执行器收到通知后会执行 binlog 的写入操作,此时的 binlog 是记录在缓存中的,写入成功后会调用引擎的提交事务接口,更新记录状态为 commit。
- 内存中的 redo log 以及 binlog 都会刷新到磁盘文件中。
内存调优
在执行查询 SQL 语句时,会涉及到两个缓存。
(1)刚进来时的 Query Cache:SQL 语句和对应的结果集。以查询 SQL 的 Hash 值
为 key,返回结果集
为 value 的键值对,判断一条 SQL 是否命中缓存
,是通过匹配查询 SQL 的 Hash 值
来实现的。
适用场景:仅限于不常修改的数据
。如果一张表数据经常进行新增、更新和删除操作,则会造成 Query Cache 的失效率非常高
,从而导致频繁地清除 Cache 中的数据
,给系统增加额外的性能开销。
查询缓存命中率:
show status like 'Qcache%'
查看 Qcache_hits,如果缓存命中率特别低的话,可以通过 query_cache_size = 0 或者 query_cache_type
来关闭查询缓存
。
相关参数:
可以通过设置合适的 query_cache_min_res_unit
来减少碎片,这个参数最合适的大小和应用程序查询结果的平均大小
直接相关:
(query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache
Qcache_free_memory 和 Qcache_queries_in_cache 的值也可以通过命令查询:
show status like 'Qcache%'
(2)存储引擎中的 Buffer 缓存
不同的存储引擎,使用的 Buffer 也是不一样的。
(1)MyISAM 存储引擎参数设置调优
MyISAM 存储引擎使用 key buffer 缓存索引块
,MyISAM 表的数据块则没有缓存
,它是直接存储在磁盘文件中的。
参数设置:通过 key_buffer_size 设置 key buffer 缓存
的大小
它的大小并不是越大越好,key buffer 缓存设置过大,实际应用却不大的话,就容易造成内存浪费,而且系统也容易发生 SWAP 页交换。
建议将服务器内存中可用内存的 1/4 分配给 key buffer。
也可以通过缓存使用率公式计算:
1-((key_blocks_unused*key_cache_block_size)/key_buffer_size)key_blocks_unused 表示未使用的缓存簇(blocks)数
key_cache_block_size 表示 key_buffer_size 被分割的区域大小
key_blocks_unused*key_cache_block_size 则表示剩余的可用缓存空间(一般来说,缓存使用率在 80% 作用比较合适)。
(2)InnoDB 存储引擎参数设置调优
InnoDB Buffer Pool(简称 IBP)
是 InnoDB 存储引擎的一个缓冲池,与 MyISAM 存储引擎使用 key buffer 缓存不同,它不仅存储了表索引块,还存储了表数据
。
- 查询数据时,IBP 允许快速返回频繁访问的数据,而无需访问磁盘文件。
- InnoDB 表空间缓存越多,MySQL 访问物理磁盘的频率就越低,这表示查询响应时间更快,系统的整体性能也有所提高。
参数设置:
- innodb_buffer_pool_size:IBP 默认的内存大小是 128M。MySQL 推荐配置 IBP 的大小为服务器物理内存的 80%。
- 命中率公式:(1-innodb_buffer_pool_reads/innodb_buffer_pool_read_request)*100
- 将 IBP 的大小设置为物理内存的 80% 以后,发现命中率还是很低,此时我们就应该考虑扩充内存来增加 IBP 的大小。
- innodb_buffer_pool_instances:将缓冲池划
分为单独的实例可以减少不同线程读取和写入缓存页面时的争用
,从而提高系统的并发性。- 该参数仅在将 innodb_buffer_pool_size 设置为 1GB 或更大时生效。
- windows 32 位操作系统:如果 innodb_buffer_pool_size 的大小超过 1.3GB,innodb_buffer_pool_instances 默认大小就为 innodb_buffer_pool_size/128MB;否则,默认为 1。
- 其他操作系统:如果 innodb_buffer_pool_size 大小超过 1GB,innodb_buffer_pool_instances 值就默认为 8;否则,默认为 1。
- 推荐配置:
- 指定 innodb_buffer_pool_instances 的大小,
保证每个缓冲池实例至少有 1GB 内存
。 - 建议 innodb_buffer_pool_instances 的大小不超过 innodb_read_io_threads + innodb_write_io_threads 之和
- 实例和线程数量比例为 1:1。
- 指定 innodb_buffer_pool_instances 的大小,
MySQL 后台线程包括了
主线程、IO 线程、锁线程以及监控线程
等。其中读写线程属于 IO 线程,主要负责数据库的读取和写入操作,这些线程分别读取和写入。
- innodb_read_io_threads / innodb_write_io_threads:MySQL 支持配置多个读写线程,即通过 innodb_read_io_threads 和 innodb_write_io_threads
设置读写线程数量
。- 读写线程数量值默认为 4,也就是总共有 8 个线程同时在后台运行。
- 协同增加缓存实例数量以及读写线程:( innodb_read_io_threads + innodb_write_io_threads ) = innodb_buffe_pool_instances
一般可以通过 MySQL 服务器保存的全局统计信息,来确定系统的读取和写入比率。
SHOW GLOBAL STATUS LIKE 'Com_select';// 读取数量
SHOW GLOBAL STATUS WHERE Variable_name IN ('Com_insert', 'Com_update', 'Com_replace', 'Com_delete');// 写入数量
InnoDB 的日志缓存大小、日志文件大小以及日志文件持久化到磁盘的策略都影响着 InnnoDB 的性能
InnoDB 中有一个 redo log 文件,InnoDB 用它来存储服务器处理的每个写请求的重做活动。执行的每个写入查询都会在日志文件中获得重做条目,以便在发生崩溃时可以恢复更改。
-
innodb_log_file_size:当日志文件大小已经超过我们参数设置的日志文件大小时,InnoDB 会自动切换到另外一个日志文件,由于重做日志是一个循环使用的环,
在切换时,就需要将新的日志文件脏页的缓存数据刷新到磁盘中(触发检查点)
。- 如果日志文件设置得太大,恢复时间就会变长,这样不便于 DBA 管理。
- 在大多数情况下,我们将日志文件大小设置为 1GB 就足够了。
-
innodb_log_buffer_size: InnoDB 重做日志缓冲池的大小,默认8MB。
- 如果高并发中存在大量的事务,该值设置得太小,就会增加写入磁盘的 I/O 操作。
- 通过增大该参数来减少写入磁盘操作,从而提高并发时的事务性能。
-
innodb_flush_log_at_trx_commit:控制重做日志从缓存写入文件刷新到磁盘中的策略,默认值为 1。
- 参数为 0 :InnoDB 每秒种就会触发一次缓存日志写入到文件中并刷新到磁盘的操作,这有可能在数据库崩溃后,丢失 1s 的数据。
- 参数为1:每次事务的 redo log 都会直接持久化到磁盘中,这样可以保证 MySQL 异常重启之后数据不会丢失。
- 参数为 2:每次事务的 redo log 都会直接写入到文件中,再将文件刷新到磁盘。
数据安全性要求比较高的场景
,该值需要设置为 1;
一些可以容忍数据库崩溃时丢失 1s 数据的场景
中,可以将该值设置为 0 或 2,可以明显地减少日志同步到磁盘的 I/O 操作。
MySQL 并发
往期精彩专栏内容,欢迎订阅:
🔗【八股消消乐】20250605:端午节产生的消费数据,如何分表分库?
🔗【八股消消乐】20250604:如何解决SQL线上死锁事故
🔗【八股消消乐】20250603:索引失效与优化方法总结
🔗【八股消消乐】20250512:慢SQL优化手段总结
🔗【八股消消乐】20250511:项目中如何排查内存持续上升问题
🔗【八股消消乐】20250510:项目中如何优化JVM内存分配?
🔗【八股消消乐】20250509:你在项目中如何优化垃圾回收机制?
🔗【八股消消乐】20250508:Java编译优化技术在项目中的应用
🔗【八股消消乐】20250507:你了解JVM内存模型吗?
🔗【八股消消乐】20250506:你是如何设置线程池大小?
🔗【八股消消乐】20250430:十分钟带背Duubo中大厂经典面试题
🔗【八股消消乐】20250429:你是如何在项目场景中选取最优并发容器?
🔗【八股消消乐】20250428:你是项目中如何优化多线程上下文切换?
🔗【八股消消乐】20250427:发送请求有遇到服务不可用吗?如何解决?
📌 [ 笔者 ] 文艺倾年
📃 [ 更新 ] 2025.6.6
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!
相关文章:

【八股消消乐】MySQL参数优化大汇总
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点ÿ…...
JavaSec-SPEL - 表达式注入
简介 SPEL(Spring Expression Language):SPEL是Spring表达式语言,允许在运行时动态查询和操作对象属性、调用方法等,类似于Struts2中的OGNL表达式。当参数未经过滤时,攻击者可以注入恶意的SPEL表达式,从而执行任意代码…...
在 Caliper 中执行不同合约的方法
在 Caliper 中执行不同的智能合约需要通过正确配置工作负载(workload)和测试轮次(rounds),下面我将详细介绍如何执行不同的合约。 1. 通过 config.yaml 配置不同测试轮次 你可以在 config.yaml 中为不同的合约定义不同的测试轮次: rounds:- label: test-helloworlddescript…...

CSS 平铺+自动换行效果
先上效果图 样式 <template><div class"activity-questions"><h1>活动题库</h1><div v-if"loading" class"loading">加载中...</div><div v-else><div v-if"questions.length 0" clas…...

微服务网关SpringCloudGateway+SaToken鉴权
目录 概念 前置知识回顾 拿到UserInfo 用于自定义权限和角色的获取逻辑 最后进行要进行 satoken 过滤器全局配置 概念 做权限认证的时候 我们首先要明确两点 我们需要的角色有几种 我们需要的权限有几种 角色 分两种 ADMIN 管理员 :可管理商品 CUSTIOMER 普通…...

永磁同步电机控制算法--模糊PI转速控制器
一、原理介绍 在常规的PID控制系统的基础上提出了一种模糊PID以及矢量变换方法相结合的控制系统,经过仿真分析对比证明: 模糊PID控制系统能够有效的提高永磁同步电机的转速响应速度,降低转矩脉动,增强了整体控制系统的抗干扰能力…...

Elasticsearch集群最大分片数设置详解:从问题到解决方案
目录 前言 1 问题背景:重启后设置失效 2 核心概念解析 2.1 什么是分片(Shard)? 2.2 cluster.max_shards_per_node的作用 2.3 默认值是多少? 3 参数设置的两种方式 3.2 持久性设置(persistent) 3.2 临时设置(transient) 4 问题解决方…...
计算机视觉与深度学习 | 基于MATLAB的图像特征提取与匹配算法总结
基于MATLAB的图像特征提取与匹配算法全面指南 图像特征提取与匹配 基于MATLAB的图像特征提取与匹配算法全面指南一、图像特征提取基础特征类型分类二、点特征提取算法1. Harris角点检测2. SIFT (尺度不变特征变换)3. SURF (加速鲁棒特征)4. FAST角点检测5. ORB (Oriented FAST …...

DVWA全靶场
目录 暴破 Low - 万能密码 Medium - 转义 High - Token Impossible 命令注入 CSRF跨站请求伪造 - 抓包 Low Medium - 域名限制 High - 域名限制xss 文件包含 - 页面点点点 Low Medium - 过滤http:// High - file Impossible - 写死 文件上传 Low Medium - 文件…...

【反无人机检测】C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测
C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测 C2FDrone: Coarse-to-Fine Drone-to-Drone Detection using Vision Transformer Networks 论文链接 摘要 摘要——基于视觉的无人机间检测系统在碰撞规避、反制敌对无人机和搜救行动等应用中至关重要。然…...

Android 本地存储路径说明
一、背景 作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过: File sdCard Environment.getExternalStorageDirectory(); 获取SD卡根目录,然后自定义文件/文件名进行文件存储.这样做法的结果就是,当手机安装了大量的app时,SD卡根目录会…...
Git 推送失败解决教程——error: failed to push some refs to
🚧 Git 推送失败解决教程: 错误信息: error: failed to push some refs to ... hint: Updates were rejected because the remote contains work that you do not have locally.🧠 问题原因简述: 你的本地分支试图将…...
spark 执行 hive sql数据丢失
spark-sql 丢失数据 1.通过spark执行hive sql 的时候,发现 hive 四条数据,spark 执行结果只有两条数据 目标对应的两条数据丢失 select date, user_id, pay from dim.isr_pay_failed where user_id ‘*******’ hive-sql 结果…...

国产pcie switch 8748+飞腾/龙芯/昇腾高速存储方案设计
方案概述 本设计以国微PCIe Switch 8748为核心交换芯片,通过多端口PCIe 4.0/5.0通道连接飞腾ARM架构处理器、龙芯LoongArch处理器及昇腾AI加速卡,构建支持NVMe协议的高速存储集群,目标实现6.5GB/s以上的可持续带宽。 硬件架构 处理器选型 飞…...
【Qt】:设置新建类模板
完整的头文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷贝构造和赋值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…...

如何使用插件和子主题添加WordPress自定义CSS(附:常见错误)
您是否曾经想更改网站外观的某些方面,但不知道怎么做?有一个解决方案——您可以将自定义 CSS(层叠样式表)添加到您的WordPress网站! 在本文中,我们将讨论您需要了解的有关CSS的所有知识以及如何使用它来修…...

开始在本地部署自己的 Gitea 服务器
0.简介 在软件开发和团队协作中,代码管理是至关重要的环节。笔者一直使用gitblit管理自己的仓库。然鹅,这个软件已经很久没有更新了。经过多方考察,发现Gitea 是一款轻量级的开源代码托管平台,具有易于部署、资源占用少、功能丰富…...

7.2.1_顺序查找
知识总览: 顺序查找: 算法思想: 从头到脚挨个找或者从脚到头挨个找适用于线性表(顺序存储和链式存储都适用),又叫线性查找 实现: 1个数组elem指向数组的起始位置,索引从0开始遍历数组直到找到目标值返回…...
spring重试机制
数据库死锁处理与重试机制实现指南 1. 业务场景 1.1 问题现象 高并发批量数据处理时频繁出现数据库死锁主要发生在"先删除历史数据,再重新计算"的业务流程中原有逐条处理方式:list.forEach(item -> { delete(); calculate(); }) 1.2 死…...
C语言的全称:(25/6/6)
C语言,全称为"C Programming Language"(C程序设计语言),是一种广泛使用的计算机编程语言。它是由Dennis Ritchie于1972年在贝尔实验室设计的,继承了B语言的许多思想,并加入了数据类型的概念及其他…...

智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体
在制造业转型升级的浪潮中,数字孪生技术正成为推动行业变革的核心引擎。从特斯拉通过数字孪生体实现车辆全生命周期优化,到海尔卡奥斯工业互联网平台赋能千行百业,数字孪生技术已从概念验证走向规模化落地。通过构建覆盖全国的交付网络&#…...

stylus - 新生代CSS预处理框架
stylus是什么 Stylus 是一种 CSS 预处理器,它扩展了 CSS 的功能,使得编写样式变得更简洁和高效。Stylus 允许使用嵌套、变量、混入等编程功能,这些功能可以极大地提高开发效率和代码的可维护性。 stylus中文文档 https://stylus.uihtm.co…...
python八股文算法:三数之和
双指针解法: 原理见注释 # 2025/6/6 9:40 # -*- coding:UTF-8 -*- nums [-1, 0, 1,1, 2, -1, -4,0,2,1,-3,4,10,-9] def three_sum(nums):nums.sort()n len(nums)result []for i in range(n-2):# n-2,此时i取值到n-2-1,即倒数第3个数&…...
HttpServletRequest常用方法
方法说明示例String getMethod()获取请求的 HTTP 方法(如 GET、POST 等)。request.getMethod() 返回 "GET"String getRequestURI()获取请求的 URI(路径部分,不包括域名和协议)。请求 http://localhost:8080/…...

BugKu Web渗透之网站被hei(仅仅是ctf题目名称)
启动场景,打开网页,显示如下: 目前没有看出任何异常。 步骤一: 右键查看源代码。源代码较多,也没发现异常。 步骤二: 用dirsearch扫描网站目录。 如图: 看起来shell.php很可疑。 步骤三&…...
群论在现代密码学中的应用探索与实践 —— 从理论到C语言实现
1. 引言:数字时代的信息安全挑战 随着互联网和数字技术的快速发展,信息安全问题变得日益严峻。无论是个人隐私保护,还是企业数据安全,乃至国家安全,都依赖于有效的加密技术保障信息的机密性和完整性。网络攻击、数据泄…...
深入理解MySQL死锁:从原理、案例到解决方案
一、MySQL死锁的概念与定义 1. 死锁的基本定义 MySQL中的死锁是指两个或多个事务在同一资源上相互等待对方释放锁,导致这些事务都无法继续执行的情况。从本质上讲,死锁是多个事务形成了一个等待环路,每个事务都在等待另一个事务所持有的锁资…...

关于华为仓颉编程语言
文章目录 一、基本概况二、技术特点1. 多范式编程2. 原生智能化3. 高性能与安全4. 全场景兼容 三、编译器与开发工具四、语言相似性对比五、行业应用实例总结 最近经常看到这个东西,于是搜了一下,整理了一些内容,水一篇,以后慢慢研…...
无字母数字webshell的命令执行
在Web安全领域,WebShell是一种常见的攻击手段,通过它攻击者可以远程执行服务器上的命令,获取敏感信息或控制系统。而无字母数字WebShell则是其中一种特殊形式,通过避免使用字母和数字字符,来绕过某些安全机制的检测。 …...
Spring AI 项目实战(五):Spring Boot + AI + DeepSeek + Redis 实现聊天应用上下文记忆功能(附完整源码)
系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4Spring AI 项目实战(四…...