MySQL8.0执行insert插入数据用时不稳定有时很慢的原因及解决

文章详细探讨了MySQL中的sync_binlog和innodb_flush_log_at_trx_commit配置对性能的影响,指出sync_binlog设置对数据完整性和写入性能的关键作用,以及如何根据磁盘性能调整这些配置以提高系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    MySQL的优化项在文章:CSDN 里列过两个,这两个是很重要的优化项。不过也有其它的一些配置项:innodb_buffer_pool_size,innodb_log_file_size,max_connections,innodb_flush_method,sync_binlog,thread_cache_size。

    文章中详细提及了innodb_flush_log_at_trx_commit配置的影响及原理。其实里面简单提及的另外一个sync_binlog也很重要。sync_binlog参数不仅影响到Binlog对MySQL的性能损耗,还影响到MySQL中数据完整性。这次再了解一下sync_binlog参数,各设置的说明如下:

#查询MYSQL性能相关的MYSQL配置
SHOW GLOBAL VARIABLES WHERE Variable_name IN('log_bin','sync_binlog','binlog_cache_size','max_binlog_cache_size','innodb_flush_log_at_trx_commit','innodb_buffer_pool_size','innodb_log_file_size','max_connections','innodb_flush_method','thread_cache_size');
innodb_flush_log_at_trx_commit = 1
log_bin = ON
sync_binlog = 1
binlog_cache_size = 32768
max_binlog_cache_size = 18446744073709547520
innodb_buffer_pool_size  = 134217728
innodb_flush_method  = fsync
innodb_log_file_size = 50331648
max_connections  = 1500
thread_cache_size = 9

     MySQL 8.0中一些设置是默认开启的(在5.7是默认关闭的),8.0默认开启了log-bin功能,在确定用不到该功能的前提下,只要在配置中关闭即可。另外innodb_flush_log_at_trx_commit和sync_binlog的默认配置都是1,而这些设置在磁盘IO性能不高的情况下会严重影响数据库性能。

sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而是让Filesystem自行决定。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

    在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为1的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。从以往经验和相关测试来看,对于高并发事务的系统来说,sync_binlog设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。

    上面的配置值中log_bin不能在session中修改,必须在配置文件中变更重启MYSQL, 在文件/etc/mysql/mysql.conf.d/mysqld.cnf 中,修改 mysqld 节点的内容,如下:

[mysqld]
#以下这两个使用一个即可。skip-log-bin和disable_log_bin作用一样。
skip-log-bin
disable_log_bin 
#MySQL8.0 Binary logging is enabled by default (the log_bin system variable is set to ON). The exception is if you use mysqld to initialize the data directory manually by invoking it with the --initialize or --initialize-insecure option, when binary logging is disabled by default. It is possible to enable binary logging in this case by specifying the --log-bin option.To disable binary logging, you can specify the --skip-log-bin or --disable-log-bin option at startup. If either of these options is specified and --log-bin is also specified, the option specified later takes precedence.

#binlog_transaction_depandency_tracking用于控制如何决定事务的依赖关系,这里说起来也是一个很长的故事。
transaction_write_set_extraction=OFF

#其它的可以通过session中命令来修改。
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 100;

SET @@global.log_bin=1
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable

    总结,通过该方法能提升一定的速度,具体影响多大和磁盘的读写性能有很大的关系,如果读写性能很差,那么性能提升就会很大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值