最近,在一个系统的慢查询日志里发现有个insert操作很慢,达到秒级,并且是比较简单的SQL语句,把语句拿出来到mysql中直接执行,速度却很快。

这种问题一般不是SQL语句本身的问题,而是在具体的应用环境中,由于并发等原因导致的。最可怀疑的地方就是在等待表级锁。

加上监控的日志来看,很多SQL是在同一时间完成的,下面的第三列是结束时间,第四列是开始时间:

14:27:30 bizId30905 1355812050  1355812045
14:27:30 bizId28907 1355812050  1355812043
14:27:30 bizId30905 1355812050  1355812047
14:27:30 bizId17388 1355812050  1355812040
14:27:30 bizId40563 1355812050  1355812044
14:27:30 bizId15477 1355812050  1355812048
14:27:30 bizId32588 1355812050  1355812048

但是通过应用的分析来看,并不存在表级锁的地方,而insert自身的操作也只是对要插入的记录本身加锁,不会影响其他并发的insert操作。

没有更好的办法,只能在MySQL写入磁盘的性能上考虑,MySQL有个innodb_flush_log_at_trx_commit参数,用来配置flush log到磁盘的时机,具体点说,是从log buffer写到log file,并写入到磁盘上的时机。这个参数的默认值是1,即每次事务提交的时候会把日志刷到磁盘,而频繁的insert操作就会引起flush log操作的不断积累,进而引发性能问题。在应用数据可接受的前提下,可以把这个值改成0,就是每秒才操作一次。修改后潜在的问题是,在事务已经提交的情况下,如果尚未写入磁盘的时候发生故障,可能丢失数据。

MySQL官网对此参数的描述如下:

If the value of innodb_flush_log_at_trx_commit is 0, the log buffer is written out to the log file once per second and the flush to disk operation is performed on the log file, but nothing is done at a transaction commit. When the value is 1 (the default), the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file. When the value is 2, the log buffer is written out to the file at each commit, but the flush to disk operation is not performed on it. However, the flushing on the log file takes place once per second also when the value is 2. Note that the once-per-second flushing is not 100% guaranteed to happen every second, due to process scheduling issues.

The default value of 1 is required for full ACID compliance. You can achieve better performance by setting the value different from 1, but then you can lose up to one second worth of transactions in a crash. With a value of 0, any mysqld process crash can erase the last second of transactions. With a value of 2, only an operating system crash or a power outage can erase the last second of transactions. InnoDB‘s crash recovery works regardless of the value.

其他角度的优化办法:

如果是MyISAM存储引擎,可以使用insert delay的方式来提高性能,其原理是MySQL自身会在内存中维护一个insert队列,在实际表空闲的时候insert数据。

从应用的角度,批量提交也是解决问题的办法,当然要在应用场景许可的前提下。

参考:

http://www.banping.com/2012/12/19/innodb_flush_log_at_trx_commit/

转载于:https://www.cnblogs.com/xiaotengyi/p/3568175.html

修改innodb_flush_log_at_trx_commit参数提升insert性能相关推荐

  1. 通过修改注册表提升SSD性能(Intel 5系列芯片组)

    在Intel P55,PM55,H55,HM55之类的芯片组上,SSD的随机读写,寻址性能都被限制了.明明在老机器上跑的好好的SSD,升了下级,竟然更烂了. Intel到底搞啥鬼,这个帖子里我来告诉你 ...

  2. 通过调整Linux内核参数提升网络性能

    2019独角兽企业重金招聘Python工程师标准>>> 如果服务器压力不大,那么维持默认即可. 下述内容取材于"Performance Tuning For Linux S ...

  3. linux提升网络实时性,通过调整Linux内核参数提升网络性能

    如下网络配置参数调整,主要是针对请求压力大的Linux (2.6 kernel)服务器而言. 如果服务器压力不大,那么维持默认即可. 下述内容取材于"Performance Tuning F ...

  4. EFI启动盘修改BIOS隐藏选项DVMT等显存参数提升性能

    背景 以前用过联想PC,型号M7360/M4310/M4311/M4320等机型,主板型号均为H61,仅CPU不同.近期拿到较新的M4350机,CPU为三代I3,使用感觉性能并无提升,比之前机型差一点 ...

  5. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升 ICLR 2021...

    导读 本文是微软&加大圣地亚哥分校的研究员在动态卷积方面的一次突破性的探索,针对现有动态卷积(如CondConv.DY-Conv)存在的参数量大.联合优化困难问题,提出了一种动态通道融合机制替 ...

  6. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升 | ICLR 2021

    还没开源 本文是微软&加大圣地亚哥分校的研究员在动态卷积方面的一次突破性的探索,针对现有动态卷积(如CondConv.DY-Conv)存在的参数量大.联合优化困难问题,提出了一种动态通道融合机 ...

  7. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升|ICLR 2021

    本文首发于极市平台公众号,作者Happy.转载需获得授权并标明出处. paper: https://arxiv.org/abs/2103.08756 code: https://github.com/ ...

  8. MySQL相关参数配置及性能优化

    MySQL及其优化 文章目录 MySQL及其优化 数据库相关概念 事务的四大特性ACID 影响mysql数据库性能的几个方面 数据库性能优化的重点 CentOS系统参数优化 内核相关参数(/etc/s ...

  9. fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能

    这篇文章很短,但很有价值~ MySQL下InnoDB存储引擎有个innodb_flush_method只读参数,用户设置InnoDB的数据和redo日志文件flush行为.defines the me ...

最新文章

  1. 第10章 评价分类结果
  2. Android App Bundle:动态功能模块
  3. android最新版本 note8,三星Note8官方国行版安卓9固件rom升级包:CHC-N9500ZCS4DSF5
  4. [NodeJs] 如何获取项目的根路径?
  5. 此时我的waga2012源码情绪也平静了许多
  6. 大数据_Spark_框架简介---Spark工作笔记0001
  7. 古时候中状元到底是一种怎样的体验?
  8. 【转载】MyBatis+MySQL 返回插入的主键ID
  9. 介绍PS大局观很不错的转文
  10. 洛谷 P1881 绳子对折
  11. oracle spfile和pfile文件(转)
  12. 【语音合成】基于matlab重叠存储法的信号分帧与还原【含Matlab源码 567期】
  13. 细粒度图像分类_基于多尺度拼图块的细粒度图像分类
  14. Linux用户管理基本配置命令运用1
  15. Ctrl+Shift+F 输入法变成繁体 输入法简体繁体切换
  16. 加拿大移民-雇主担保移民政策解读
  17. 图像质量评价指标MSE/PSNR/SSIM
  18. c++字符串中元音字母转置
  19. 如何成就一个小而美的存储科技公司?
  20. 01-初探MQ-MQ的三大使用场景:应用解耦、异步提速、削峰填谷

热门文章

  1. POJ_3262 Protecting the Flowers 【贪心】
  2. 大型运输行业实战_day12_1_权限管理实现
  3. java基本类型的默认值及其取值范围
  4. 软件工程课设-----日程管理系统
  5. 每日一问:LayoutParams 你知道多少?
  6. Docker 常用命令备忘录
  7. hive如何处理not in和in的问题
  8. QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能
  9. eclipse编译hadoop插件
  10. Hello Views之Spinner(yaozq翻译,仅供参考)