• mysql⾼并发插⼊慢


    一、代码优化

    发现接⼝实现类中有个地⽅做了代码同步控制synchorized,分析后感觉没必要就去掉了,性能提⾼到7秒左右,虽然提⾼了,⼤还是不⾏,进⼀步优化。

    二、数据库配置修改01

    数据库安装时,没有修改任何配置,全部为默认配置,⽹上查询解决⽅案:

    (一)解决方案

    set global sync_binlog=1000;  
    set global innodb_flush_log_at_trx_commit=2

    (二)什么是sync_binlog和innodb_flush_log_at_trx_commit

    这两个参数是控制MySQL 磁盘写⼊策略以及数据安全性的关键参数

    1、innodb_flush_log_at_trx_commit

    如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。

    如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.

    如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

    注意:

    由于进程调度策略问题,这个“每秒执行一次 flush(刷到磁盘)操作”并不是保证100%的“每秒”。

    2、sync_binlog

    sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。

    当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

    注:

    如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作。

    3、性能

    两个参数在不同值时对db的纯写入的影响表现如下:

    测试场景1

    innodb_flush_log_at_trx_commit=2

    sync_binlog=1000

    测试场景2

    innodb_flush_log_at_trx_commit=1

    sync_binlog=1000

    测试场景3

    innodb_flush_log_at_trx_commit=1

    sync_binlog=1

    测试场景4

    innodb_flush_log_at_trx_commit=1

    sync_binlog=1000

    测试场景5

    innodb_flush_log_at_trx_commit=2

    sync_binlog=1000

     
    场景
    TPS
    场景1
    41000
    场景2
    33000
    场景3
    26000
    场景4
    33000

    由此可见,当两个参数设置为双1的时候,写入性能最差,sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL的写操作才能达到最高性能。

    4、安全

    当innodb_flush_log_at_trx_commit和sync_binlog  都为 1 时是最安全的,在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。但是鱼与熊掌不可兼得,双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。

    当innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。

    当innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

    双1适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时 比如11.11 活动的压力。推荐的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N为500 或1000) 且使用带蓄电池后备电源的缓存cache,防止系统断电异常。

    系统性能和数据安全是业务系统高可用稳定的必要因素。我们对系统的优化需要寻找一个平衡点,合适的才是最好的,根据不同的业务场景需求,可以将两个参数做组合调整,以便是db系统的性能达到最优化。

    三、数据库配置修改02

    (一)innodb_buffer_pool_size 缓冲区配置,什么是 innodb_buffer_pool_size

    MySQL 缓存表数据,索引数据的地⽅。增加它的值可以减少磁盘 io ,提升读写性能。

    提升读的原理:因为 buffer_pool_size 设置的⽐较⼤, 很多表数据和索引已缓存到 buffer pool , 要查询的数据在缓存中找到了,就不需要访问磁盘了。读性能就得到了提升。

    提升写的原理:因为 buffer_pool_size 设置的⽐较⼤, 写的数据,暂时以脏页的⽅式放在内存,然后慢慢落到磁盘,如果buffer_pool_size 太⼩就没办法缓存写操作,写⼀次访问⼀次磁盘 ,写⼊性能就⽐较慢。(实际⾃测增⼤buffer_pool_size后,并未带来纯写操作的性能提升, 这块有待进⼀步研究)

    设置多⼤的 innodb_buffer_pool_size 合适? 通常将innodb_buffer_pool_size其配置为物理内存的50%到75%,在my.ini中设置,重启

    mysql:

    四、结束语

    最后再进⾏压⼒测试,性能提⾼到1s

  • 相关阅读:
    csv,exl自动提取表头两列英文字段按英文名称排序显示
    javascript:的用法
    OLAP ODS 项目总结 BI 中的关键
    一些性能查询的SQL 备忘
    ArcGIS 10 SDE for ORACLE 迁移 (3)
    如何测试一个ETL_BI 系统
    ArcGIS 10 SDE for ORACLE 迁移 (2)
    fsck.ext3: Unable to resolve 'LABEL=/design'
    ArcGIS 10 SDE for ORACLE 迁移 (4)
    BI 中关于度量的SQL计算
  • 原文地址:https://www.cnblogs.com/yifanSJ/p/16309545.html
Copyright © 2020-2023  润新知