mysql修改local inflie_MySQL LOAD DATA INFILE—批量从文件(csv、txt)导入数据

adf5a424c898fe8530f09057c689d591.png

最近做的项目,有个需求(从Elastic Search取数据,业务运算后),每次要向MySQL插入1300万条数据左右。最初用MySQL的executemany()一次插入10000条数据,统计的时间如下:

e5daecaf2c0309c3ff7eccdc48f79bde.png

如上,插入时间由于系统的IO变化,会有波动,最快在4秒左右。

后改为"load data infile"大概,10万条数据平均1秒~1.5秒,实际的代码示例如下:

query = "LOAD DATA INFILE '/var/lib/mysql-files/es.csv' INTO TABLE g_visit_relation_asset_temp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES \

(srcip, srcport, dstip, dstport, l7p, @dummy, cnt, @dummy, cnt_date)"mysqlcur.execute(query)

mysqlconn.commit()

说明:

(1)MySQL需要开启对"load data inflie"的权限支持

mysqlcur.execute("SET GLOBAL local_infile = 1")

(2)

需要对mysql文件目录(笔者: “/var/lib/my-files/”)有管理员的权限(查看mysql路径,用“locate mysql”)

如果没有的话,可以指定本地路径,需要加上关键字"local"即:

LOAD DATA LOCAL

(3)Concurrency支持

如果默认是 LOW_PRIORITY,则LOAD DATA要等其它客户端读完了,才会开始写入。加上“Concurrency ”可以,在读的同时,同时支持写入,不过速度会稍微下降一点,笔者测试环境影响不大

(4)IGNORE 1 LINES (跳过第一行)

笔者通过python pandas to_csv()导出的csv是带标题的,如下:

1f1cda3e675822c77c26254c13edde81.png

不需要标题导入到数据库,就调过嘛

(5)@dummy ,通过占位符,跳过不需要的数据

导入到表的column顺序必须和文件保持一致,通过@dummy可以跳过不需要的column

(6)character set 指定字符集

对于汉字,你需要加上 character set utf8

(8)分隔符及换行符

以“,“作为分隔符,以“\n"作为换行符: FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'

其他性能优化相关(Only forMyISAM):

通过设置隔离级别、去除索引检查、唯一性检查等提高速度(分session和global级别)提高写入速度,插入之前,设置如下配置:

mysqlcur.execute("SET SESSION FOREIGN_KEY_CHECKS = 0")

mysqlcur.execute("SET SESSION UNIQUE_CHECKS = 0")

mysqlcur.execute("SET SESSION tx_isolation='READ-UNCOMMITTED'")

mysqlcur.execute("SET SESSION sql_log_bin = 0")

Loda data infile 完了再改回去,如下:

mysqlcur.execute("SET SESSION FOREIGN_KEY_CHECKS = 1")

mysqlcur.execute("SET SESSION UNIQUE_CHECKS = 1")

mysqlcur.execute("SET SESSION tx_isolation='REPEATABLE-READ'")

mysqlcur.execute("SET SESSION sql_log_bin = 1")

“DISABLE KEYS” 然后“ENABLE KEYS”,笔者实际测试没什么用,只是导入数据更快,总的时间并没有提升。区别在于:一个是插入一条,创建一个索引;一个是全部导入完了后,再一次创建所有索引。

引用:

*******************************************************************************************

精力有限,想法太多,专注做好一件事就行

我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创

写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

*******************************************************************************************

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值