在 MySQL 的 InnoDB 存储引擎中,部分数据库优化策略

news/2025/2/25 7:06:47

在 MySQL 的 InnoDB 存储引擎中,以下操作是 同步的,并且会直接影响数据库执行 SQL 的效率:


1. Redo Log 的同步刷盘(事务提交时)

  • 触发条件:

    当 innodb_flush_log_at_trx_commit=1 时,事务提交时强制将 Redo Log 同步刷盘到磁盘。

  • 影响:

    • 增加提交延迟:每次提交需等待磁盘 I/O 完成,对高并发写入场景(如电商秒杀)的吞吐量影响显著。

    • 数据安全性:确保事务持久性,崩溃后不丢失已提交事务。

优化建议:

若允许容忍少量数据丢失(如日志系统),可设置 innodb_flush_log_at_trx_commit=2(依赖 OS 刷盘)或 =0(每秒刷盘)。


2. 双写缓冲区(Double Write Buffer)的写入

  • 触发条件:

    脏页刷盘时,先同步将页副本写入双写缓冲区,再写入数据文件。

  • 影响:

    • 增加 I/O 开销:每个脏页需额外写入双写缓冲区(总写入量增加)。

    • 降低写入吞吐量:对写入密集型场景(如批量导入)有一定性能影响。

优化建议:

全 SSD 环境下可关闭双写缓冲区(innodb_doublewrite=OFF),传统硬盘不建议关闭。


3. Binlog 的同步刷盘(事务提交时)

  • 触发条件:

    当 sync_binlog=1 时,事务提交时强制将 Binlog 同步刷盘到磁盘。

  • 影响:

    • 增加提交延迟:与 Redo Log 同步刷盘叠加,进一步降低写入性能。

    • 主从一致性:确保 Binlog 不丢失,主从复制数据一致。

优化建议:

若允许主从延迟,可设置 sync_binlog=N(每 N 次提交刷盘)或 =0(依赖 OS 刷盘)。


4. 行级锁的竞争

  • 触发条件:

    事务对同一行数据加锁(如 SELECT ... FOR UPDATE 或 UPDATE)。

  • 影响:

    • 阻塞并发:未提交事务会阻塞其他事务对同一行的修改。

    • 死锁风险:高并发下可能引发死锁,需额外处理。

优化建议:

  • 减少事务粒度(如避免长事务)。

  • 使用乐观锁(如版本号)替代悲观锁。

  • 优化索引,减少锁范围。


5. 数据页的同步读取(Buffer Pool Miss)

  • 触发条件:

    查询所需数据页不在 Buffer Pool 中,需从磁盘加载。

  • 影响:

    • 增加查询延迟:同步 I/O 阻塞查询线程,影响响应时间。

    • 随机 I/O 开销:机械硬盘环境下尤为明显。

优化建议:

  • 增大 innodb_buffer_pool_size,提升内存命中率。

  • 使用 SSD 减少随机 I/O 延迟。


6. 检查点(Checkpoint)的强制刷盘

  • 触发条件:

    Redo Log 空间不足时,强制刷盘脏页以推进 Checkpoint。

  • 影响:

    • 短暂性能抖动:同步刷盘大量脏页可能导致 I/O 瓶颈。

优化建议:

  • 增大 Redo Log 文件大小(innodb_log_file_size)。

  • 监控 Redo Log 使用率,避免空间耗尽。


总结:同步操作对性能的影响

操作

同步性

性能影响场景

优化方向

Redo Log 刷盘(=1)

同步

高并发写入

调整刷盘策略(=2/=0)

双写缓冲区写入

同步

写入密集型负载

SSD 环境下关闭双写

Binlog 刷盘(=1)

同步

主从复制 + 高并发写入

调整刷盘策略(=N)

行级锁竞争

同步

高并发修改同一行

减少锁粒度、优化事务设计

数据页同步读取

同步

Buffer Pool Miss 频繁

扩大 Buffer Pool、使用 SSD

Checkpoint 强制刷盘

同步

Redo Log 空间不足

增大 Redo Log 文件、监控空间使用


最终建议

  1. 权衡安全与性能:

    • 核心业务设置 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1,确保数据安全。

    • 非核心业务可适当放宽配置(如 =2 或 =0),提升吞吐量。

  2. 硬件优化:

    • 使用 SSD 减少同步 I/O 延迟。

    • 确保内存充足(避免频繁 Buffer Pool Miss)。

  3. 监控与调优:

    • 监控 Innodb_row_lock_waits、Innodb_buffer_pool_reads 等指标,针对性优化锁和内存使用。

    • 定期检查 Redo Log 和 Binlog 的空间使用情况。


http://www.niftyadmin.cn/n/5865136.html

相关文章

GreatSQL修改配置文件参数无法生效

GreatSQL修改配置文件参数无法生效 一、问题描述 客户需要创建无主键表,因提供默认模板设置了参数sql_require_primary_key ON(创建新表或更改现有表结构的语句强制要求表具有主键),当创建无主键表时会提示ERROR 3750 (HY000):…

4. Spring Cloud Gateway 入门与使用

一、什么是网关? 网关是一种网络设备,用于连接两个或多个不同网络,将数据从一个网络转发到另一个网络。它充当了两个网络之间的桥梁,负责转发数据并处理来自不同网络的通信协议转换。 二、网关有什么用? 网关的主要作用有以下几个: 路由…

【个人开源】——从零开始在高通手机上部署sd(一)

代码:https://github.com/chenjun2hao/qualcomm.sd 从零基础开始,在自己的高通手机(骁龙8 gen1)上用NPU跑文生图stable diffusion模型。包含: 高通qnn下载安装sd模型浮点/量化导出在高通手机上用cpu跑浮点模型,htp跑量化模型 1. python依赖…

6.3 - UART串口数据发送之中断

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验使用中断方式实现UART串口数据的连续发送。 2 系统框图 参见6.1。 3 软件设计 注意事项: 系统上电、程序下载后,此时TX FIFO虽然为空,但是并不会触发空中断;空中…

【高速公路——Tarjan】

题目 BFS暴力代码 60p #include <bits/stdc.h> using namespace std;const int N 1010; const int M 10010; int g[N][N]; int n, m; int h[N], e[M], ne[M], idx;void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; }void bfs(i…

vue2版本elementUI的table分页实现多选逻辑

1. 需求 我们需要在表格页上实现多选要求&#xff0c;该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key&#xff0c;用来优化 Table 的渲染&#xff1b;在使用 reserve-selection 功能与显示树形数据时&…

UE5 Gameplay框架及继承关系详解

文章目录 前言一、核心类及其继承关系二、核心类的职责与协作2.1 Actor & Pawn2.2 Controller2.3 GameMode & GameState2.4 PlayerState2.5 HUD & UI 三、协作流程示例总结 前言 Unreal Engine 5&#xff08;UE5&#xff09;的 Gameplay 框架 是一个高度模块化的系…

OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用图像中选定区域的邻域来恢复该选定区域。 cv::inpaint 函数是 OpenCV 中用于图像修复&#xff08;Inpainting&#xff09;的一个重要函数。它…