Mysql 之百万数据导入

1、方法

  • 直接source sql 文件进行直接导入(不推荐)
  • Load data infile命令进行导入(推荐)
  • 更换引擎,将表的InnoDB引擎改为MyISAM,再导入数据(不推荐)
  • 将导入数据的单条SQL语句为多条进行数据的导入(推荐)
  • 存储过程 + 事务进行有序插入(有兴趣的可以自己试试)

1.1 直接导入(不推荐)

这种方式就不需要讲了,简单暴力,直接source

use example_database;
source your_disk:/yourpath/example.sql

总结:这种导入方式进行百万数据的导入,你可以尝试一下,我在半小时才导入了2万多条数据,如果是百万的话,可以估计一下时间。所以不推荐使用这种方法

1.2 Load data infile导入(推荐)

1.2.1 基本介绍:

load data infile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。

注意

  • 文件必须处于数据库目录或可被所有人读取
  • 服务器主机上你必须有file的权限。

1.2.2 语法结构:

load data  [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name,   )]

说明:

  • 如果指定low_priority关键词,那么MySQL将会等到没有其他人读这个表的时候,才把插入数据
  • 如果指定local关键词,则表明从客户主机读文件。如果local没指定,文件必须位于服务器上
  • replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输入
  • fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
    • terminated by 分隔符:意思是以什么字符作为分隔符
    • enclosed by 字段括起字符
    • escaped by 转义字符
    • terminated by 描述字段的分隔符,默认情况下是tab字符(\t)
    • enclosed by 描述的是字段的括起字符。
    • escaped by 描述的转义字符。默认的是反斜杠(backslash:\ )
  • lines 关键字指定了每条记录的分隔符默认为’\n’即为换行符

1.2.3 举例子:

(一)文件数据

"我爱你","20","相貌平常,经常耍流氓!哈哈"
"李奎","21","相貌平常,经常耍流氓!哈哈"
"王二米","20","相貌平常,经常耍流氓!哈哈"
"老三","24","很强"
"老四","34","XXXXX"
"老五","52","***%*¥*¥*¥*¥"
"小猫","45","中间省略。。。"
"小狗","12","就会叫"
"小妹","21","PP的很"
"小坏蛋","52","表里不一"
"上帝他爷","96","非常英俊"
"MM来了","10","。。。"
"歌颂党","20","社会主义好"
"人民好","20","的确是好"
"老高","10","学习很好"
"斜三","60","眼睛斜了"
"中华之子","100","威武的不行了"
"大米","63","我爱吃"
"苹果","15","好吃"

(二)示例表结构

CREATE TABLE `t0` (`id` bigint(20) unsigned NOT NULL auto_increment,`name` char(20) NOT NULL,`age` tinyint(3) unsigned NOT NULL,`description` text NOT NULL,PRIMARY KEY  (`id`),UNIQUE KEY `idx_name` (`name`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

(三)导入命令

# ignore忽略重复的数据
# terminated 数据是以逗号风格的
# enclosed by 字段是以""括起来的
# lines terminated 数据是分行
load data infile '/tmp/t0.txt' ignore into table t0 character set gbk fields terminated by ',' enclosed by '"' lines terminated by '\n' (`name`,`age`,`description`);

(四)导入情况

mysql> select * from t0;
+----+----------+-----+----------------------------+
| id | name     | age | description                |
+----+----------+-----+----------------------------+
|  1 | 我爱你   |  20 | 相貌平常,经常耍流氓!哈哈 |
|  2 | 李奎     |  21 | 相貌平常,经常耍流氓!哈哈 |
|  3 | 王二米   |  20 | 相貌平常,经常耍流氓!哈哈 |
|  4 | 老三     |  24 | 很强                       |
|  5 | 老四     |  34 | XXXXX                      |
|  6 | 老五     |  52 | ***%*¥*¥*¥*¥           |
|  7 | 小猫     |  45 | 中间省略。。。             |
|  8 | 小狗     |  12 | 就会叫                     |
|  9 | 小妹     |  21 | PP的很                     |
| 10 | 小坏蛋   |  52 | 表里不一                   |
| 11 | 上帝他爷 |  96 | 非常英俊                   |
| 12 | MM来了   |  10 | 。。。                     |
| 13 | 歌颂党   |  20 | 社会主义好                 |
| 14 | 人民好   |  20 | 的确是好                   |
| 15 | 老高     |  10 | 学习很好                   |
| 16 | 斜三     |  60 | 眼睛斜了                   |
| 17 | 中华之子 | 100 | 威武的不行了               |
| 18 | 大米     |  63 | 我爱吃                     |
| 19 | 苹果     |  15 | 好吃                       |
+----+----------+-----+----------------------------+
19 rows in set (0.00 sec)

总结:利用这种方式导入百万数据,可以试试,只需
要几十秒而已,特别快速。推荐

1.3 更换引擎

这个主要是在创建表的时候,将使用的引擎由Inoodb 改为 MyISAM 再导入

创表语句:

CREATE TABLE `t0` (`id` bigint(20) unsigned NOT NULL auto_increment,`name` char(20) NOT NULL,`age` tinyint(3) unsigned NOT NULL,`description` text NOT NULL,PRIMARY KEY  (`id`),UNIQUE KEY `idx_name` (`name`)
) ENGINE= MyISAM DEFAULT CHARSET=utf8

然后再采用上面两种方式进行数据导入的时候:

  • innodb + 直接导入:插入了3万条数据,花费了半小时。
    MyISAM + 直接导入:插入了3万条数据,花费了十分钟。
  • innodb + Load data infile:插入了百万条数据,花费了40几秒。
    MyISAM + Load data infile:插入了百万条数据,花费了30几秒。

总结:更换引擎的方式进行导入数据的话,明显会快一点,但是MyISAM 与 innodb 的区别还是很大的,为了后续的一些操作,不建议采用这种方式。

1.2.4 合并单条SQL语句为多条再导入

这种方法主要是把上百万条插入数据的sql,合并为1000条sql,每一条sql进行1000条数据的插入

例如:

多条sql:

insert ignore into actor values (1 , 'PENELOPE' , 'GUINESS'  ,'2006-02-15 12:34:33'),
insert ignore into actor values (2 , 'NICK' , 'WAHLBERG'  ,'2006-02-15 12:34:33');

一条sql:

insert ignore into actor values(1 , 'PENELOPE' , 'GUINESS'  ,'2006-02-15 12:34:33'),(2 , 'NICK' , 'WAHLBERG'  ,'2006-02-15 12:34:33');

具体如何进行合并,可以有两种方法:

  • 直接进行手动合并(如果你觉得你脑子有问题的话)
  • 利用程序,利用python、Java直接操作文件,进行合并(具体就不再讲解了)

总结:这种方式进行导入的话,按照一条sql插入1000行数据,进行1000次插入的操作这种方法用来进行100万数据导入,只花了2分钟左右,也推荐采用

Mysql 之百万数据导入相关推荐

  1. 报表技术2(百万数据导入导出,POI操作word)

    POI模板导出,操作word 导出用户详情数据(图片,公式处理) 使用模板导出用户详细信息 使用模板引擎 1.编写模板引擎 2.使用模板引擎 百万数据导出 代码实现: 百万数据导入 步骤分析: 1.自 ...

  2. Oracle 导入 txt (oracle 10) 百万数据导入 txt

    索引 1.1.1,Oracle 百万数据导入 txt 1.1.2,准备工作 1.1.3,首先我们创建个测试账户 #1.1.4,写个测试表 1.1.5,编写自动入库脚本 ctl 1.1.6,示例1 编写 ...

  3. pythonmysql数据分析_Python操作Mysql数据库入门——数据导入pandas(数据分析准备)...

    原标题:Python操作Mysql数据库入门--数据导入pandas(数据分析准备) 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求 ...

  4. 低版本mysql数据导入高版本_将高版本mysql数据库的数据导入低版本mysql中

    前言 最近做了个网站,准备放到虚拟主机上的时候,发现本地数据库是mysql5.6,服务器上的mysql是5.0的.于是尝试导出数据,结果,导入的数据不是出错,就是各种乱码.折腾了好久之后,终于找到了解 ...

  5. 使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)

    在之前转载的一腾讯高级工程师<一文彻底了解Logstash>对logstach有这详细的介绍,这里我只说明一下,将mysql中的数据使用logstash导入到es中,如何操作,具体步骤见下 ...

  6. mysql将备份的数据导入_成功将MySQL的大型数据导入导出和备份(转载)

    原来的数据使用的是MySQL4.1,大概有800M左右.使用 mysqldump -u username -p dbname > "filename" 导出的时候很容易死掉, ...

  7. navcat导入mysql bak_navcat excel数据导入mysql的方法

    navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...

  8. 将mysql中的数据导入到sqlite3中

    不知道如何创建数据库的可以先看这篇: https://blog.csdn.net/blackei/article/details/80403272 当我们使用固定的信息时,比如省市信息,区划代码,物品 ...

  9. POI报表及百万数据导入导出方案

    1.POI报表的概述 1.1 需求说明 在企业级应用开发中,Excel报表是一种最常见的报表需求.Excel报表开发一般分为两种形式:为了方便操作,基于Excel的报表批量上传数据:通过java代码生 ...

最新文章

  1. slimphp中间件调用流程的理解
  2. PHP动态网页转换HTML的一个简单办法
  3. js 日期对象 31 号 setMonth 的锅
  4. 计算机网络之应用层:5、万维网、http协议
  5. python中pip不是内部或外部命令_解决pip不是内部或外部命令
  6. 钉钉用户数破5亿 低代码应用数8个月增长86万
  7. 循环机换变速箱油教程_问答| 想更换变速箱油,是重力换还是循环换?
  8. git 合并其他分支代码到自己的分支
  9. 登录注册HTML页面代码
  10. 利用PPT要怎样绘制正弦曲线
  11. 爱奇艺发布年报:四季度运营大幅减亏,今年提质增效追盈利
  12. Android之bugly使用
  13. 疯狂填词 mad_libs 第9章9.9.2
  14. 【英语-同义词汇词组】consider,think,believe,count,deem,reckon,regard、hold 表示【认为】时的用法及区别
  15. 构建orangePi r1 plus (RK3328)系统的整个过程
  16. 什么是5G LAN 5G LAN商用爆发推动5G创新应用 提速数字转型新引擎
  17. 大数据开发工程师要求高么?有前景么
  18. 一篇文章学会 SVN
  19. 微信再次改版!这个功能终于要下线
  20. 第四十六章 使用 ^SystemPerformance 监视性能 - 生成 ^SystemPerformance 性能报告

热门文章

  1. 太难了!微信借钱语音确认过还被骗了
  2. 生成对抗网络(Generative Adversarial Networks,GAN)初探
  3. IDEA无法自动导包问题
  4. 快速了解做一款App所用到的技术,及实现流程
  5. i春秋网鼎杯网络安全大赛advanced题目writeup
  6. DS博客大作业--树 (陈梓灿组)
  7. C语言—输出菱形(一次循环嵌套实现)
  8. 多选框的全选和全不选
  9. 启动与阿里巴巴年货节·县域农资招商对接活动
  10. 利用html开发英语单词小程,前端利用表单标签自己制作一个简单的表单页面-表单制作-小程序表单制作...