我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据

MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据

MySQL LOAD DATA INFILE 从文件(csv、txt)批量导入数据

 

 最近做的项目,有个需求(从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 "
" IGNORE 1 LINES 
                        (class="lazy" data-srcip, class="lazy" data-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)分隔符及换行符

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

其他性能优化相关(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亿条数据到mysql — https://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql (自备梯子)
  •  MySQL 官方文档说明 — https://dev.mysql.com/doc/refman/8.0/en/load-data.html

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

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

  • 我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL LOAD DATA INFILE—批量从文件(csv、txt)导入数据

MySQL LOAD DATA INFILE   最近做的项目,有个需求(从Elastic Search取数据,业务运算后),每次要向MySQL插入1300万条数据左右。最初用MySQL的executemany()一次插入10000条数据,统计的
MySQL LOAD DATA INFILE—批量从文件(csv、txt)导入数据
2017-11-05

MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据

MySQL LOAD DATA INFILE 从文件(csv、txt)批量导入数据   最近做的项目,有个需求(从Elastic Search取数据,业务运算后),每次要向MySQL插入1300万条数据左右。最初用MySQL的executeman
MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据
2018-04-08

我们如何使用带有“FIELDS TERMINATED BY”选项的 MySQL LOAD DATA INFILE 语句将数据从文本文件导入到 MySQL 表中?

当我们想要导入 MySQL 表的文本文件的值由逗号 (,) 或任何其他分隔符(如冒号 (:))分隔时,应使用“FIELDS TERMINATED BY”选项,可以通过下面的例子来理解 -例子假设我们有以下数据,用分号(;)分隔,在我们想要导
2023-10-22

如何批量上传CSV文件数据到MySql表中?使用 LOAD DATA 的一种非常快速的方法

? 简介您还在使用“for”或“while”循环来迭代行并将它们插入数据库吗?您还在编写单独的代码来读取 .csv 文件并将其上传到 mysql 数据库吗?用mysql提供的“load data”语句对线性逻辑说“不”。准备好更改代码以最大
如何批量上传CSV文件数据到MySql表中?使用 LOAD DATA 的一种非常快速的方法
2024-08-19

编程热搜

目录