分享

mysql提高insert into 插入速度的方法

 昵称45943784 2019-07-08
innodb_flush_log_at_trx_commit

就是说设为1时:会在每个事务提交后会执行往磁盘写日志的操作。设为0或2可减少日志对磁盘IO的负担。0表示每秒往磁盘写一次日志,2表示每次事务都往内存提交日志,但每秒往磁盘仅写入一次。现在想想为什么之前插入这么慢,就是因为每个inset完成后都往磁盘写日志,导致占满了磁盘IO(我观察了磁盘IO,参数设为1的时候磁盘占用时间保持100%)

插入速度只有20-30 条/秒,后来查资料后,将MySQL的1个参数:innodb_flush_log_at_trx_commit,1改为了0(修改方法,可以直接修改my.ini(windows)/my.cnf(linux)中的对应参数,似乎用命令直接设置没有效果),插入速度就提升到了3000+每S,

更新的速度会比插入的速度快很多。本地测试发现插入40-50/s,更新在200-250/s


mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
临时改:set global innodb_flush_log_at_trx_commit=2;重启数据库后失效


加大mysql配置中的 bulk_insert_buffer_size,这个参数默认为8M


本地测试结果:
innodb_flush_log_at_trx_commit=0时,20个线程,20的连接池,平均5000/s. 2500~7500.
innodb_flush_log_at_trx_commit=1时,20个线程,20的连接池,平均420/s. 250~740.
innodb_flush_log_at_trx_commit=2时,20个线程,20的连接池,平均2700/s. 2000~3500.


本地测试结果(SSD):
innodb_flush_log_at_trx_commit=0时,20个线程,20的连接池,平均7000/s. 5000~8000.
innodb_flush_log_at_trx_commit=1时,20个线程,20的连接池,平均5000/s. 4000-6000.
innodb_flush_log_at_trx_commit=2时,20个线程,20的连接池,平均4000/s. 2000-4500.


要提高写入速度可以使用批量写入的方式进行提高:
一个客户端进行测试:
INSERT test (id,name,value,sex,createDate)VALUES(UUID(),'xingxingxingxing','huangyongxinghuangyongxing',71,NOW());

1条插入:48条/s
10条插入:400条/s
20条插入:700条/s
40条插入:1350条/s
120条插入:3500条/s
200条插入:5500条/s
240条插入:7000条/s
480条插入:11000条/s
960条插入:15000条/s

在系统中可以使用队列的方式先保存下来,另一个线程进行获取并批量写入







https://www.cnblogs.com/snailmanlilin/p/7017137.html(MySQL插入10万数据时间(结论:最快14.967s,每秒插入6681条))

[url]https://blog.csdn.net/hwhua1986/article/details/53501882 [/url](insert插入数据过慢如何解决,设置innodb_flush_log_at_trx_commit为0就能解决)

https://blog.csdn.net/codepen/article/details/52160715(有关mysql的innodb_flush_log_at_trx_commit参数)

https://blog.csdn.net/thundermeng/article/details/50448614(innodb_flush_log_at_trx_commit和sync_binlog参数详解)







    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多