MySQL快速导入千万条数据(3)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL快速导入千万条数据(3)

接上文,本次在较高性能的X86物理机上,做真实生产环境的大数据量导入测试。

一、测试环境

■ CPU是24核,每核2线程,即48CPU

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                48
On-line CPU(s) list:   0-47
Thread(s) per core:    2
Core(s) per socket:    12
座:                 2
NUMA 节点:         2
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              85
型号名称:        Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz
步进:              4
CPU MHz:             2301.000

■ 内存376G

$ free -g
              total        used        free      shared  buff/cache   available
Mem:            376          21           5         126         349         226
Swap:            16           0          16

■ 数据磁盘是SAS磁盘

Model: AVAGO HW-SAS3508 (scsi)
Disk /dev/sdb: 12.0TB

■ 磁盘IO写入性能测试,结果:1.1GB/s

[root@adg1:0 /u01]# time dd if=/dev/zero of=/u01/test bs=8k count=1000000
1000000+0 records in
1000000+0 records out
8192000000 bytes (8.2 GB) copied, 7.51518 s, 1.1 GB/s

■ 磁盘IO读取性能测试,结果:3.9GB/s

[root@adg1:0 /u01]# time dd if=/u01/test of=/dev/null bs=8k count=1000000
1000000+0 records in
1000000+0 records out
8192000000 bytes (8.2 GB) copied, 2.09241 s, 3.9 GB/s

■ 操作系统环境是红帽7.4

NAME="Red Hat Enterprise Linux Server"
VERSION="7.4 (Maipo)"
PRETTY_NAME="Red Hat Enterprise Linux Server 7.4 (Maipo)"

■ 文件系统采用xfs

Filesystem                  Type      Size  Used Avail Use% Mounted on
/dev/mapper/vgora-lv_u01    xfs        11T  792G   11T   8% /u01

■ db version
Server version: 5.5.56-MariaDB MariaDB Server

二、命令行导入方式

使用最原始的命令行方式测试,如下:
mysql -uroot -ppasswd' --default-character-set=utf8 dbname < mysql.sql
用一个简单的导入脚本,用于记录时间:

cat > test.sh << EOF
echo "Start ...("\`date "+%Y%m%d-%H:%M:%S"\`")"
mysql -uroot -p'passwd' --default-character-set=utf8 dbname < \$1
echo "Completed.("\`date "+%Y%m%d-%H:%M:%S"\`")"
EOF
chmod +x test.sh

测试结果如下:耗时57分钟

Start ...(20220227-12:22:12)
Completed.(20220227-13:19:04)

可见这个命令行导入方式,即使在实际的高性能生产环境,几千万条数据的导入,长达一个小时的时间,也是几乎无法接受的。但如果几百万行数据的导入,十几分钟时间还可以勉强接受。

三、LOAD DATA导入方式

关于LOAD DATA的详细介绍请网搜,此处不再赘述。
首先,修改原SQL文件格式为LOADDATA可用的csv文本格式:

sed -i "s/INSERT INTO \`tablename\` VALUES (//g" mysql.sql
sed -i "s/);//g" mysql.sql

经过以上自动编辑处理,原SQL文件内容成为如下格式:

'40601438', 'CF_0105', '121589425857.3000', '56814', null, '121589425857.3000'
'40601439', 'CF_0105', '113776588.1400', '56815', null, '113776588.1400'

然后,执行导入,如下所示:导入3000万条数据,耗时104秒

root@localhost:dbname> LOAD DATA LOCAL INFILE '/u01/mysql/mysql.sql'
    -> INTO TABLE tablename
    -> FIELDS TERMINATED BY ', '
    -> ENCLOSED BY "'"
    -> LINES TERMINATED BY '\n'
    -> IGNORE 34 lines;
Query OK, 30578985 rows affected, 5932 warnings (1 min 43.76 sec)
Records: 30578985  Deleted: 0  Skipped: 0  Warnings: 5932
root@localhost:dbname> select count(*) from tablename;
+----------+
| count(*) |
+----------+
| 30578985 |
+----------+

创建索引耗时1分钟左右

root@localhost:dbname> ALTER TABLE tablename ADD INDEX `master_id` (`master_id`);
Query OK, 0 rows affected (1 min 2.14 sec)
Records: 0  Duplicates: 0  Warnings: 0
root@localhost:dbname> ALTER TABLE tablename ADD INDEX `code` (`code`);
Query OK, 0 rows affected (1 min 43.77 sec)
Records: 0  Duplicates: 0  Warnings: 0

四、结论

针对MySQL数据库,上千万条数据的大量导入,使用LOAD DATA方式导入,一般生产环境耗时1分钟左右。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
关系型数据库 MySQL
MySQL 保姆级教程(五):数据过滤
MySQL 保姆级教程(五):数据过滤
|
4天前
|
关系型数据库 MySQL
MySQL 保姆级教程(四):过滤数据
MySQL 保姆级教程(四):过滤数据
|
4天前
|
关系型数据库 MySQL
MySQL 保姆级教程(三):排序检索数据
MySQL 保姆级教程(三):排序检索数据
|
4天前
|
关系型数据库 MySQL 数据库
MySQL 保姆级教程(二):使用 MySQL 检索数据
MySQL 保姆级教程(二):使用 MySQL 检索数据
|
2天前
|
关系型数据库 MySQL API
MySQL上亿数据查询优化:实践与技巧
MySQL亿级数据查询优化涉及索引设计、分区表、查询语句优化和数据库架构调整。例如,通过为常用查询列创建索引、使用EXPLAIN分析查询计划、避免全表扫描和SELECT *,以及采用垂直拆分、水平拆分和读写分离来提升性能。分区表能减少查询数据量,API接口测试可验证优化效果。
8 0
|
9天前
|
SQL NoSQL 关系型数据库
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
|
10天前
|
关系型数据库 MySQL 数据库
MybatisPlus添加数据数据库没有数据,数据消失,使用Navicate看不到数据,Navicate中Mysql的数据与idea的数据不一定同步,Navicate与idea的数据库同步,其实有分页
MybatisPlus添加数据数据库没有数据,数据消失,使用Navicate看不到数据,Navicate中Mysql的数据与idea的数据不一定同步,Navicate与idea的数据库同步,其实有分页
|
10天前
|
关系型数据库 MySQL 数据库
mysql,归零,无法自动排序,删除id,表单的数据没有从零开始出现怎样解决?删除数据仍然从删除的地方该怎样解决?表单的数据没有从2开始,而是从之前的删除的序号开始自增。
mysql,归零,无法自动排序,删除id,表单的数据没有从零开始出现怎样解决?删除数据仍然从删除的地方该怎样解决?表单的数据没有从2开始,而是从之前的删除的序号开始自增。
|
10天前
|
SQL 关系型数据库 MySQL
Navicate,数据库,Mysql,改表,4月29日Finished - Unsuccessfully,导出数据不妨,右键,备份一下Mysql数据库的内容,你想导入和导出数据不如,用查询的方式去做
Navicate,数据库,Mysql,改表,4月29日Finished - Unsuccessfully,导出数据不妨,右键,备份一下Mysql数据库的内容,你想导入和导出数据不如,用查询的方式去做
|
11天前
|
SQL Oracle 关系型数据库
MySQL单表千万级数据查询优化大家怎么说(评论有亮点)
单表千万级数据是MySQL查询的一个坎,可能还不是天花板。“一个人走的慢,一群人走的快”,通过讨论可以发现MySQL千万数据的全貌大概是怎样的。
23 0