关于Mysql表InnoDB下插入速度慢的解决方案
2023-09-14 08:59:54 时间
最近做了 server_log 日志数据库记录,仅仅插入,由平台来获取数据进行分析的需求。
但是内部反馈插入数据库记录非常耗时,我就很纳闷了,一个insert怎么会 30-50ms 呢?按说应该在 0.5ms 以内的;
经过分析,发现是InnoDB数据库的Row_Format格式问题,改为MyISAM表就可以了,但是InnoDB是支持事务的,一般是推荐InnoDB的,好奇为什么。
而且InnoDB的表,只能选择 COMPACT 和REDUNDANT 两种行格式(RoW_FORMAT)。
经过搜索获得:
innodb_flush_log_at_trx_commit
该参数控制重做日志写入磁盘的过程。我们知道 InnoDB 使用“Write Ahead Log”策略来避免数据丢失问题,即依靠重做日志来保证数据能在丢失后进行恢复。因此,InnoDB 重做日志的持久化非常重要。 该参数的有效值有 0、1、2: 0:事务提交时,不将重做日志缓冲写入磁盘,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。因此如果 MySQL 发生宕机,那么就有可能丢失一部分事务。 1:事务提交时,会将重做日志缓冲写入磁盘,并且立即刷新(fsync())。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。 2:事务提交时,会将重做日志缓冲写入磁盘,但是不会立即进行刷新操作,因此只是写到了操作系统的缓冲区。此时若操作系统发生宕机而没有即使的同步,也可能会丢失一部分数据。 可以看到,只有1才能真正地保证事务的持久性,但是由于刷新操作 fsync() 是阻塞的,直到完成后才返回,我们知道写磁盘的速度是很慢的,因此 MySQL 的性能会明显地下降。如果不在乎事务丢失,,0和2能获得更高的性能。 --------------------- 作者:yyyiue 来源:CSDN 原文:https://blog.csdn.net/stfphp/article/details/57413894 版权声明:本文为博主原创文章,转载请附上博文链接!
经过测试,修改值为0或者2 后,插入速度果然提升了,1.4秒可以插入2W条记录,平均<1ms满足需求.
参考链接:
MySQL 重要参数 innodb_flush_log_at_trx_commit 和 sync_binlog
相关文章
- MySQL : 全表锁定的解决方案(mysql锁所有表)
- MySQL集群技术:实现高可用的可靠性解决方案(mysql集群解决方案)
- MySQL数据库的配置方法简介(mysql怎么配置)
- MySQL主键排序ID管理指南(mysql排序id)
- MySQL绿色版安装指南(mysql绿色版安装)
- 复制MySQL不同库:一种有效解决方案(mysql不同库复制)
- 策略MySQL双重备份策略: 确保数据安全性(mysql多备份)
- MySQL是否区分大小写(mysql区分大小写吗)
- 如何在MySQL中生成唯一的订单号?(mysql订单号)
- MySQL数据库重置:一步一步(mysql 重置数据库)
- Linux忘记MySQL密码解决方案(linux忘记mysql密码)
- MySQL中PID的作用和意义(mysql中pid是什么)
- MySQL中遇到42000错误如何解决(mysql 中42000)
- MySQL 使用 Bacula 构建有效的备份解决方案 (bacula mysql)
- MySQL 32进制乱码解决方案(32进制乱码mysql)
- MySQL参数变量的作用和用法详解(mysql中参数变量)
- MySQL找不到bin目录的解决方法(mysql下面没有bin)
- 如何查询MySQL版本号(mysql下那个版本号)