接上文,本次在较高性能的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快速导入千万条数据(3)的更多相关文章

  1. python+mysql:实现一千万条数据插入数据库

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

  2. python连接mysql循环插入千万条数据脚本

    之前都是在mysql的存储过程中插入数据,毕竟mysql语法函数有限,很多都有限制.突然想到学了python正好可以练练手.首先需要安装pymysql模块包(模块包安装请自行百度) pip insta ...

  3. MySQL 快速添加百万条数据

    需要向数据库添加100W条测试数据,直接在普通表中添加速度太慢,可以使用内存表添加,然后将内存表数据复制到普通表 创建表 # 内存表 DROP TABLE IF EXISTS `test_memory ...

  4. 【JDBC】使用Spring提供的JDBCTemplate通过Statement向MySql数据库插入千万条数据,耗时4m55s,使用insert语句批量插入方式二

    这回依然是使用 insert批量插入这种方式 insert into emp(name,age,cdate) values ('A' , 20, '2019-10-13 00:00:00'), ('B ...

  5. 【JDBC】使用Spring提供的JDBCTemplate通过PrepareStatement向MySql数据库插入千万条数据,耗时32m47s,速度提升有限

    数据库环境还和原来一样,只是从Statement换成了PrepareStatement,都说PrepareStatement因为预编译比Statement快,但是实际运行真快不了多少. 代码如下: p ...

  6. mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式)

    mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式) 首先将要导入的数据文件top5000W.txt放入到数据库数据目录/var/local/mysql/data/${d ...

  7. mysql自定义函数并在存储过程中调用,生成一千万条数据

    mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...

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

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

  9. [MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mys ...

  10. orcle 如何快速插入百万千万条数据

    有时候做实验测试数据用到大量数据时可以用以下方法插入: 方法一:使用xmltable create table bqh8 as select rownum as id from xmltable('1 ...

随机推荐

  1. 2. 搭建Mybatis

    确认开发环境​ MySQL不同版本的注意事项 1.驱动类driver-class-name MySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.Driver MySQL 8 ...

  2. springboot中自定义JavaBean返回的json对象属性名称大写变小写问题

    目录 一.继承类 二.手动添加Get方法 三.@JsonProperty 四.spring-boot json(jackson)属性命名策略 开发过程中发现查询返回的数据出现自定义的JavaBean的 ...

  3. redis集群报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

    之前在x86架构的服务器部署redis集群,未遇到题中问题:然而在ARM架构的服务器部署redis集群,第一次遇到如此问题.虽然问题已经解决,但不清楚问题的具体原因,在此做个记录. 性能测试过程中,通 ...

  4. SSM项目整合思路以及代码

    当前真实的企业开发中,SpringBoot已经统一Java企业应用开发,很少有在使用SSM项目来进行项目开发的. 可是在教学阶段,还是很有必要给学生讲解Java开发中一套很经典的框架,SSM框架.作为 ...

  5. Codeforces Round #875 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  6. MarkdownQuote:简化 Markdown 中的代码引用!

    MarkdownQuote:简化 Markdown 中的代码引用! 这是 SourceCodeTrace 项目之一,通过在 IDE 中提供一种便捷的方式,快速复制包含代码来源 Markdown 代码块 ...

  7. Redis 集群偶数节点跨地域部署之高可用测试

    笔者目前所在公司存在多套 Redis 集群: A 集群 主 + 从 共 60 个分片,部署在 3 + 3 台物理机上,每台机器各承载 10 个端口 主库 30 个端口在广州,从库 30 个端口在中山 ...

  8. flex布局入门

    一.简介 Flexible 单词意思是灵活的意思,flex布局又称为弹性布局或弹性盒子布局 Flex布局(Flexible Box Layout)是CSS3引入的一种布局模型,它旨在提供一种灵活且高效 ...

  9. 简单运维oceanbase

    简单运维oceanbase 数据库集群参数修改 直连 proxy 连接 手动修改参数 show parameters like '%xx%' ; alter system set xxx='xx'; ...

  10. TypeScript: 類型 'HTMLElement | null' 不可指派給類型 'HTMLElement'。 類型 'null' 不可指派給類型 'HTMLElement'

    报错截图 解决方案 在结尾添加叹号 // 获取页面中food的元素并将其赋值给element this.element = document.getElementById('food')!;