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

如上,插入时间,由于系统的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是带标题的,如下:

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

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

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

(6)character set 指定字符集

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

(8)分隔符及换行符

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

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

通过设置隔离级别、去除索引检查、唯一性检查等提高速度(分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年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

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

最新文章

  1. .NET基础拾遗(2)面向对象的实现和异常的处理基础
  2. js事件浅析
  3. linux随笔2
  4. Verilog学习笔记认识提升篇(一)...............时序的基本概念(待补充)
  5. jQuery绑定事件的四种方式
  6. 【POJ 3321】Apple Tree
  7. Kendo UI for ASP.NET MVC 的一些使用经验(转)
  8. CString 转 char*; wstring 转 string
  9. 解析$.grep()源码及透过$.grep()看(两次取反)!!的作用
  10. SDUTRescue The Princess(数学问题)
  11. 更改Zend Studio/Eclipse代码风格主题
  12. OSCHina技术导向:Java模板引擎velocity
  13. 损失函数 hinge loss vs softmax loss
  14. python笔记三(list、tuple)
  15. ISP PIPLINE (十二) Sharpening
  16. elephant-bird学习笔记
  17. ImageView setImageURI图片不改变\NetWorkImageView 不显示的问题
  18. day 26 网络通讯流程 初识socke
  19. vue中$route 和$router的区别
  20. [原创] 浅谈ETL系统架构如何测试?

热门文章

  1. 4.String字符串类型操作
  2. 求最长非降(递增)子序列LIS的长度,及注意事项
  3. 第一次写js轮播图
  4. WEB APPLICATION PENETRATION TESTING NOTES
  5. 潜入FLEXBOX——CSS弹性布局
  6. UPX的使用
  7. Java并发编程 (一) 导读
  8. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers
  9. Java实现 LeetCode 26 删除排序数组中的重复项
  10. java实现 洛谷 P1014 Cantor表