LOAD DATA INFILE读取CSV中一千万条数据至mysql

作业要求

构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万条记录。

注:关系movies的主键为(title,year)

要求如下:

  1. 在尽可能短的时间内完成;
  2. 只允许使用原生的SQL,不允许将SQL作为嵌入语言,也不允许使用其他语言如C#、Python等来完成;
  3. 提交你的详细解决方案和结果。

本文利用LOAD DATA INFILE将包含一千万条数据的CSV文件存入mysql。

实现

除了newcsv.py,其他命令均为cmd命令。

生成包含1千万条数据的CSV文件

用python生成与关系movies结构相同的包含1千万条数据的CSV文件。

newcsv.py如下:

该程序大概耗时18秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import csv
import time

# num_value条数据
num_value = 10000000

# 开始计时
time_start = time.time()

# 生成文件
with open(r'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\bigdata.csv', 'w', newline='') as f:
f_csv = csv.writer(f)
f_csv.writerow(['title', 'year', 'length', 'movieType', 'studioName', 'producerC'])

for i in range(1, num_value+1):
f_csv.writerow(['GoGoGo', i, 120, 'sicFic', 'MGM', 100])

# 结束计时
time_end = time.time()

# 输出耗费时间(秒)
print('Time Cost:', time_end - time_start)

登录mysql

1
mysql -uroot -p123456

上面root是我的mysql用户名,123456是我的mysql密码。

进入数据库moviesdb

1
use moviesdb;

创建关系mymovies

只复制关系movies的结构,并不复制其数据

1
CREATE TABLE mymovies LIKE movies;

将CSV文件存入数据库

1
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/bigdata.csv' INTO TABLE mymovies FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

我的电脑上,该文件存入mysql耗时862.646秒,大概14分钟,如下图所示:

LOADDATAINFILE插入一千万条数据结果

参考链接

https://www.cnblogs.com/freefei/p/7679991.html

https://blog.csdn.net/qq_22855325/article/details/76087138

https://blog.csdn.net/weixin_44595372/article/details/88723191

https://zhidao.baidu.com/question/185665472.html

https://www.cnblogs.com/zhangjpn/p/6231662.html

https://www.cnblogs.com/wangcp-2014/p/8038683.html

https://blog.csdn.net/gb4215287/article/details/82669785


作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!