MySQL双一参数性能测试
MySQL双一参数
MySQL 数据库中有两个非常重要的参数,一个是innodb_flush_log_at_trx_commit,另外一个是sync_binlog,这两个参数称之为双一参数,前者控制了redo log 的刷盘机制,后者控制了binlog 的刷盘机制
这两个参数取值不同时,会影响数据库性能以及安全。
| 参数名称 | 允许值 |
|---|---|
| innodb_flush_log_at_trx_commit | 0, 1, 2 |
| sync_binlog | 0,1, N |
sync_binlog
sync_binlog是MySQL Binlog日志的重要参数,用于控制Binlog的更新策略,通过对该参数的调优,可以提升数据库的性能和数据安全性:
0:binlog 不刷盘,依赖于操作系统的刷盘机制,在断电或者是操做系统崩溃的情况下,这些事务将全部丢失1:这是最安全的方式,binlog 在 binlog 组提交的 sync 阶段都进行刷盘操作,在断电或操作系统崩溃的情况下,二进制日志中丢失的事务仅处于准备状态,在恢复的时候直接回滚掉N:binlog 将在 N 次 sync 队列形成后进行 sync 刷盘
innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit是MySQL InnoDB存储引擎独有的参数,用于控制InnoDB的Redo log日志记录方式。通过调优该参数,可以提升数据库的性能和数据安全性。该参数的取值范围为0、1、2,不同的值代表MySQL数据库的Redo log不同的刷盘的方式
1: 当innodb_flush_log_at_trx_commit=1时,InnoDB将在每次事务提交时将log buffer的数据更新到文件系统os buffer中,并调用文件系统的flush操作将数据缓存更新至磁盘中。此种方式下,数据库完全遵守ACID特性,安全性较高2:当innodb_flush_log_at_trx_commit=2时,InnoDB将在每次事务提交时将log buffer中的数据更新到文件系统缓存中,每秒钟将文件系统缓存中的数据更新到磁盘一次,该操作由操作系统调度。因为DDL变更或其他InnoDB内部原因会导致更新磁盘的操作独立于innodb_flush_log_at_trx_commit参数设置,不能完全保证每秒更新磁盘一次,没有被更新到磁盘中的事务可能会因宕机而丢失0:当innodb_flush_log_at_trx_commit=0时,InnoDB会每秒钟将log buffer中的数据更新到磁盘中。因为DDL变更或其他InnoDB内部原因会导致更新磁盘的操作独立于innodb_flush_log_at_trx_commit参数设置,并不能完全保证每秒将数据更新到磁盘一次。因此,在实例崩溃恢复场景中,可能会出现丢失1秒钟的事务

需要注意的是:
- 当设置为0时,速度最快,安全性最差,mysqld进程的崩溃最多会导致上一秒钟所有事务数据的丢失。
- 当设置为1,该模式是最安全的,对数据库的性能影响也最大,即使宕机也不会丢失事务。
- 当设置为2,该模式速度较快,较取值为0情况下更安全,mysqld crash不会丢失事务,但宕机则可能丢失事务
最佳实践
您可以按照您的业务场景,根据下表来选择最适合您的配置。
| innodb_flush_log_at_trx_commit | sync_binlog | 描述 |
|---|---|---|
| 1 | 1 | 适用于对数据安全性要求非常高,同时磁盘有足够的写入能力的场景。这种模式下性能最差 |
| 1 | 0 | 适用于对数据安全性要求高,但是磁盘写入能力有限的场景。 |
| 2 | N | 对数据安全性要求低,此时性能最佳 |
| 0 | 0 | 对数据安全性要求不高,应用需要较快的写入能力 |
性能测试配置
只写测试
# 准备数据,执行以下sysbench命令可以创建,sysbench的内置表,并在每个表中生成对应数据
# --table_size 没个表多少行数据
# --tables 多少个表
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_write \
--table_size=100000 \
--tables=10 \
--events=0 \
--time=600 \
/usr/local/share/sysbench/oltp_write_only.lua prepare# 测试数据(run)
# --report-interval 多少秒报告一次
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_write \
--table_size=100000 \
--tables=10 \
--time=200 \
--threads=30 \
--report-interval=5 \
/usr/local/share/sysbench/oltp_write_only.lua run# 清理测试数据(cleanup),将生成的表删除
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_write \
--table_size=100000 \
--tables=10 \
/usr/local/share/sysbench/oltp_write_only.lua cleanup
只更新测试(没有index)
# 准备数据,执行以下sysbench命令可以创建,sysbench的内置表,并在每个表中生成对应数据
# --table_size 没个表多少行数据
# --tables 多少个表
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_update \
--table_size=100000 \
--tables=10 \
--events=0 \
--time=600 \
/usr/local/share/sysbench/oltp_update_non_index.lua prepare# 测试数据(run)
# --report-interval 多少秒报告一次
# --time 测试120s
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_update \
--table_size=100000 \
--tables=10 \
--report-interval=5 \
--threads=30 \
--time=200 \
/usr/local/share/sysbench/oltp_update_non_index.lua run# 清理测试数据(cleanup),将生成的表删除
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_update \
--table_size=100000 \
--tables=10 \
/usr/local/share/sysbench/oltp_update_non_index.lua cleanup
只更新数据(有index)
# 准备数据,执行以下sysbench命令可以创建,sysbench的内置表,并在每个表中生成对应数据
# --table_size 没个表多少行数据
# --tables 多少个表
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_update_index \
--table_size=100000 \
--tables=10 \
--events=0 \
--time=600 \
/usr/local/share/sysbench/oltp_update_index.lua prepare# 测试数据(run)
# --report-interval 多少秒报告一次
# --time 测试120s
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_update_index \
--table_size=100000 \
--tables=10 \
--report-interval=5 \
--threads=30 \
--time=200 \
/usr/local/share/sysbench/oltp_update_index.lua run# 清理测试数据(cleanup),将生成的表删除
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_update_index \
--table_size=100000 \
--tables=10 \
/usr/local/share/sysbench/oltp_update_index.lua cleanup
只读数据
# 准备数据,执行以下sysbench命令可以创建,sysbench的内置表,并在每个表中生成对应数据
# --table_size 没个表多少行数据
# --tables 多少个表
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_read \
--table_size=100000 \
--tables=10 \
--events=0 \
--time=600 \
/usr/local/share/sysbench/oltp_read_only.lua prepare# 测试数据(run)
# --report-interval 多少秒报告一次
# --time 测试120s
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_read \
--table_size=100000 \
--tables=10 \
--report-interval=5 \
--threads=30 \
--time=200 \
/usr/local/share/sysbench/oltp_read_only.lua run# 清理测试数据(cleanup),将生成的表删除
sysbench --db-driver=mysql \
--mysql-host=xxx \
--mysql-port=xxx \
--mysql-user=root \
--mysql-password=xxx \
--mysql_storage_engine=innodb \
--mysql-db=benchmark_read \
--table_size=100000 \
--tables=10 \
/usr/local/share/sysbench/oltp_read_only.lua cleanup
性能测试结果
# bitnami 容器设置参数,bitnami默认脚本写死了,是基于命令行启动的,且默认启动为双一启动的- name: MARIADB_EXTRA_FLAGS value: --sync-binlog=0 --innodb_flush_log_at_trx_commit=0# 镜像坐标:docker.io/bitnami/mariadb:10.6.10
| innodb_flush_log_at_trx_commit | sync_binlog | 类型 | tps/s | qps/s | 95分位延迟(ms) | 压测线程数 | MariaDB配置 | CPU/内存使用率 |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 只写 | 1296.23 | 7777.36 | 42.61 | 30 | 1C2G /10.6 | 100%/45% |
| 0 | 0 | 只写 | 1426.84 | 8561.04 | 54.83 | 30 | 1C2G /10.6 | 100%/32% |
| 1 | 1 | 更新(no_index) | 3396.20 | 3396.20 | 13.95 | 30 | 1C2G /10.6 | 80%/15% |
| 0 | 0 | 更新(no_index) | 5787.01 | 5787.01 | 41.85 | 30 | 1C2G /10.6 | 100%/32% |
| 1 | 1 | 更新(with_index) | 3271.28 | 3271.28 | 15.27 | 30 | 1C2G /10.6 | 85%/16% |
| 0 | 0 | 更新(with_index) | 4930.37 | 4930.37 | 52.89 | 30 | 1C2G /10.6 | 100%/32% |
| 1 | 1 | 只读 | 447.49 | 7159.90 | 94.10 | 30 | 1C2G /10.6 | 100%/16% |
| 0 | 0 | 只读 | 449.51 | 7192.15 | 94.10 | 30 | 1C2G /10.6 | 100%/32% |
相关文章:
MySQL双一参数性能测试
MySQL双一参数 MySQL 数据库中有两个非常重要的参数,一个是innodb_flush_log_at_trx_commit,另外一个是sync_binlog,这两个参数称之为双一参数,前者控制了redo log 的刷盘机制,后者控制了binlog 的刷盘机制 这两个参…...
CodeSys创建自定义的html5控件
文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料:https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子:https://forge.codesys.com/…...
Xcode15报错: SDK does not contain ‘libarclite‘
pod lib lint *** 报错 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 或者xcode…...
矩阵快速幂
快速幂 #include<iostream> using namespace std;int main(){int a, b, p;cin>>a>>b>>p;int res 1 % p;while(b){if(b & 1) res 1ll * res * a % p;a 1ll * a * a % p;b >> 1;}cout<<res;return 0; }斐波那契数列 #include <ios…...
数据之谜:解读Facebook的用户行为
在当今数字化时代,社交媒体平台已经成为人们生活中不可或缺的一部分,而Facebook作为全球最大的社交网络之一,其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为,并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…...
学习 考证 帆软 FCP-FineBI V6.0 考试经验
学习背景: 自2024年1月起,大部分时间就在家里度过了,想着还是需要充实一下自己,我是一个充满热情的个体。由于之前公司也和帆软结缘,无论是 Fine-Report 和 Fine-BI 都有接触3年之久,但是主要做为管理者并…...
《过滤器模式(极简c++)》
本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 本章简要说明过滤器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案: 过滤器模式是一种结构型设计模式,用于过滤一组对象,基…...
【C++】如何用一个哈希表同时封装出unordered_set与unordered_map
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.哈希桶源码 2.哈希…...
Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件
目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注(CTF题型) PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…...
web安全之:三种常见的Web安全威胁
Web安全是确保Web应用和用户数据安全的一系列措施和实践。了解和防御常见的安全威胁是每个Web开发人员的基本职责。下面,我们将详细讨论三种常见的Web安全威胁:SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)…...
C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序
1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…...
Dubbo框架的介绍
什么是dubbo Dubbo是一个高性能的、轻量级的开源RPC(远程过程调用)框架,由阿里巴巴公司开发并开源。它提供了基于Java的远程服务调用和管理的解决方案,可以帮助开发者快速构建分布式应用和服务。 Dubbo具有以下特点: …...
手机实时监控电脑屏幕(手机可以看到电脑在干什么吗)
已经2024年了,假如你还在问我,手机可以看到电脑在干什么吗,有没有手机实时监控电脑屏幕的系统。 那么证明,你可能已经out 了。 现代科技告诉发展的态势下,这种技术已经很成熟了。 域智盾软件就可以实现这种效果↓我们…...
合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测
原文链接:合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx7&snc054ed7c9d9c433d00837a7798080935&chksmfa820329cdf58a3f6b5986d6d4da3d19f81e3efd0b159f…...
云原生(五)、Docker-Swarm集群
基础环境说明 1、环境准备 1、启动4台服务器(在同一个网段内)。 2、重命名4台服务器,方便区分。 hostnamectl set-hostname swarm1 reboot安装docker。参考文章:云原生(二)、Docker基础 2、DockerSwarm…...
arm核的DMPIS是如何计算的
直接看这篇:https://zhuanlan.zhihu.com/p/660155292 写的很好: "SA8155P的CPU算力计算如下(按照A75性能提升50%来计算,即 5.2 * 1.5 7.8 DMIPS/MHz ) SA8155P算力 2.419GHz * 1核 * 7.8 DMIPS/MHz 2.131GH…...
Axure RP 9 for Mac中文激活版:原型设计工具
Axure RP 9 for Mac是一款值得设计师信赖的原型设计工具。它以其卓越的性能和稳定的运行赢得了广大用户的赞誉。 软件下载:Axure RP 9 for Mac中文激活版下载 在Axure RP 9中,您可以尽情发挥自己的设计才华,创造出独一无二的原型作品。无论是…...
Hive 数据迁移与备份
迁移类型 同时迁移表及其数据(使用import和export) 迁移步骤 将表和数据从 Hive 导出到 HDFS将表和数据从 HDFS 导出到本地服务器将表和数据从本地服务器复制到目标服务器将表和数据从目标服务器上传到目标 HDFS将表和数据从目标 HDFS 上传到目标 Hiv…...
FFMpeg 获取音频音量、提高音量
查看音量 准备原生音频original.mp3 查看original.mp3的音量信息: ffmpeg -i original.mp3 -filter_complex volumedetect -c:v copy -f null /dev/null输出: Input #0, mp3, from original.mp3:Metadata:artist : Administratorencoder …...
【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)
【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌:每个人抓的牌放到哪里: 源码具体实现cardcardsTest 个人简介:努力学编程 每日鸡汤:stay foolish,stay hungry-史蒂芬.乔布斯斯…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
