最近做的项目,有个需求(从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年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

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

MySQL LOAD DATA INFILE—批量从文件(csv、txt)导入数据的更多相关文章

  1. mysql load data infile的使用 和 SELECT into outfile备份数据库数据

    LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE t ...

  2. MySQL Load Data InFile 数据导入数据库

    常用如下: Load Data InFile 'C:/Data.txt' Into Table `TableTest` Lines Terminated By '\r\n'; 这个语句,字段默认用制表 ...

  3. Mysql load data infile 导入数据出现:Data truncated for column

    [1]Mysql load data infile 导入数据出现:Data truncated for column .... 可能原因分析: (1)数据库表对应字段类型长度不够或修改为其他数据类型( ...

  4. Mysql load data infile 命令导入含中文csv源数据文件 【错误代码 1300】

    [1]Load data infile 命令导入含中文csv源数据文件 报错:Invalid utf8 character string: '??֧' (1)问题现象 csv格式文件源数据: 导入SQ ...

  5. 解决ubuntu server mysql load data infile 导入本地文件ERROR 1148 (42000)错误。

    问题:在ubuntu server 上使用apt-get 安装完 mysql 使用 load data infile 出现错误,错误代码如下: ERROR (): The used command i ...

  6. MySQL通过 LOAD DATA INFILE 批量导入数据

    LOAD DATA INFILE 语句用法 参考手册 本文语句参数使用默认值 PHP:  TP框架环境 // 定义文件路径$file_path = 'LOAD_DATA_LOCAL_INFILE.tx ...

  7. 【转载】Mysql load data infile用法(万级数据导入,在几秒之内)

    https://blog.csdn.net/u014082714/article/details/53173975 http://blog.itpub.net/26506993/viewspace-2 ...

  8. Mysql LOAD DATA读取客户端任意文件漏洞复现(原理分析)

    环境搭建 怎么设置Mysql支持外联? use mysql; grant all privileges on *.* to root@'%' identified by '密码'; //授权语句 fl ...

  9. MySQL load data infile

    语法: load data [low_priority] [local] infile ‘file_path' [replace] [ignore] into table table_name [(c ...

随机推荐

  1. PIX防火墙配置A/S故障切换

    PIX防火墙配置A/S故障切换 1.基本命令 failover show failover failover lan enable failover lan interface zwish e2 fa ...

  2. jQuery-语言基础整理

    jQuery是js的一个类库,主要封装的是js中DOM操作部分,使用和原生js一样 1.需要先引入页面才可以使用 代码引入:<script src='jquery.js'></scr ...

  3. DataGuard VS Beedup & GoldenGate灾备方案参数对比

    世上本无完美产品,只有合适的才是最好的! 用户重视灾备数据站点的建设,毋庸置疑必备品.如果考虑带宽及事务完整性保证,存储灾备和操作系统级灾备局限性显而易见. 商用价值一般用于解决数据库自带辅助功能的短 ...

  4. C# winform 学习(一)

    目标 1.类和对象 2.定义类 3.对象的操作 4.命名空间 一.类和对象 1.理解 1)类:具有共同特征和行为的一类事物的统称 2)对象:类的一个具体唯一的实例 eg: 1路公交车;(类) 车牌为F ...

  5. Java实现 LeetCode 402 移掉K位数字

    402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...

  6. Java实现 LeetCode 50 Pow(x,n)

    50. Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, ...

  7. java实现第四届蓝桥杯大臣的旅费

    大臣的旅费 题目描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大 ...

  8. 给Linux小白的CentOS8.1基本安装说明

    写在前面的话:用过Linux的同学应该都会觉得Linux安装是件非常简单的事情,根本不值得用博客记下来!但是我发现,其实没接触过Linux的同学还真不一定会装,就像在IT行业工作过几年但一直用Wind ...

  9. 01-Python初体验

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  10. hadoop知识整理(3)之MapReduce之代码编写

    前面2篇文章知道了HDFS的存储原理,知道了上传和下载文件的过程,同样也知晓了MR任务的执行过程,以及部分代码也已经看到,那么下一步就是程序员最关注的关于MR的业务代码(这里不说太简单的): 一.关于 ...