mysql innodb insert_MySQL innodb load data.vs.insert 前因后果

前一段时间接了个业务比较特殊,它的场景是这样的:

–每天入库数据量3亿左右

–写多读少,每隔5分钟写入10w数据

–按天分表,多年同一天的数据在一个表里

–同一天的数据每隔5分钟更新一次

–数据来源,经过Hadoop分析过后的csv文件

--类似于这样的,会有并发同时跑,但是数据量和间隔时间不一样

数据库配置:普通sas盘,24G内存,16核CPU,单实例,1主1备

优化前的做法是:

1. 把原来的前几分钟的数据根据日期delete掉

2. 使用程序读取分析过的csv文件,拼装成insert into tbname (col1,col2,......) values (val1,val2,....,),(val3,val4,.......,),.......;

存在问题:

1. 主库写入太慢最长的一个表插入时间要329分钟

2. 备库延迟太大(>20w秒),慢查询文件很大16G,存在单点故障

效率图:

633714f806d174dcfe4351aa055d3c73.png

优化做法:

把insert换成load

优化成果:

389d0789c43fcff0cd02e817855f25a0.png

CPU消耗情况:

1a86b4d5aa41cd77f8a47aebc0da6ff2.png

io情况有所好转,但是iowait仍然严重,因为本来就是io bound型,虽然减少了大部分记录慢日志的io,其他io情况,没有像写入效率那么明显。

备库没有延迟,解决了单点故障

原因:

MySQL手册里已经说得很清楚:

1.  关掉自动提交

2.  禁掉唯一索引

3.  禁掉外键

这样能节省大量物理io

原因:

load data跳过sql解析,直接生成数据文件;

load data在导入之前会关掉索引,导入完成后更新索引;

load data开始执行后占用的内存空间不会被purge掉

另外load data的速度和文件每行的大小有关,每行所占的字节数越少,load的速度越快;同样的前提,没有索引的要比有索引的要快;

如何提高插入表的效率,欢迎移步: http://www.informit.com/articles/article.aspx?p=377652&seqNum=4

http://www.innodb.com/doc/innodb_plugin-1.0/innodb-create-index.html

http://www.mysqlperformanceblog.com/2008/04/23/testing-innodb-barracuda-format-with-compression/

http://www.mysqlperformanceblog.com/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值