接上文,继续测试3000万条记录快速导入数据库。
一、导入前1000万条数据
清库、建库、新建表结构、导入前1000万条数据,结果:
■ 1000万行,有2索引导入耗时:16分钟
Query OK, 9999966 rows affected, 5920 warnings (16 min 12.95 sec)
Records: 9999966 Deleted: 0 Skipped: 0 Warnings: 5920
可见,导入千万条数据,性能下降明显。
二、导入前2000万条数据
清库、建库、新建表结构、导入前2000万条数据,结果:
■ 2000万行,无 索引导入耗时:45分钟
Query OK, 19999966 rows affected, 5920 warnings (45 min 2.05 sec)
Records: 19999966 Deleted: 0 Skipped: 0 Warnings: 5920
可见,导入更大量的数据,性能更是急剧下降,2000万条记录耗时长达45分钟!
由于是笔记本虚机,怀疑cpu性能、io性能、内存配置导致了这个结果。
三、导入后面的1000万条数据
由于一次导入千万条数据性能较低,因此决定把后面的1000万行,拆分为两部分,分两次导入,如下操作:
split -l 6000000 mysql_ab mysql_ab_
得到两个文件:
mysql_ab_aa 600万行
mysql_ab_ab 4579017行
插入mysql_ab_aa:耗时15分钟
LOAD DATA LOCAL INFILE '/root/mysql_ab_aa'
INTO TABLE tablename
FIELDS TERMINATED BY ', '
ENCLOSED BY "'"
LINES TERMINATED BY '\n';
Query OK, 6000000 rows affected (15 min 30.23 sec)
Records: 6000000 Deleted: 0 Skipped: 0 Warnings: 0
插入mysql_ab_ab:耗时8分钟
LOAD DATA LOCAL INFILE '/root/mysql_ab_ab'
INTO TABLE tablename
FIELDS TERMINATED BY ', '
ENCLOSED BY "'"
LINES TERMINATED BY '\n';
Query OK, 4579017 rows affected (7 min 51.05 sec)
Records: 4579017 Deleted: 0 Skipped: 0 Warnings: 0
四、建索引
再把对应的两个索引建上,每个索引耗时:3分钟
mysql> ALTER TABLE tablename ADD INDEX `master_id` (`master_id`);
Query OK, 0 rows affected (1 min 34.94 sec)
ALTER TABLE tablename ADD INDEX `code` (`code`);
Query OK, 0 rows affected (3 min 30.58 sec)
可见,3000万数据建普通索引,几分钟时间还是挺快的。
五、总结
纵观以上测试,导入3000万条数据耗时73分钟,如果将SQL文件拆分为单个文件500万条以内,可能会耗时更短,也许能控制在60分钟以内,如果电脑配置更高,则会更快。
后续继续在X86物理机做一个验证测试。