首页 > 数据库 >MySQL快速导入千万条数据(3)

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

时间:2022-08-29 21:12:17浏览次数:152  
标签:千万条 mysql 导入 GB MySQL root CPU u01

接上文,本次在较高性能的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,导入,GB,MySQL,root,CPU,u01
From: https://www.cnblogs.com/likingzi/p/16637377.html

相关文章

  • MySQL快速导入千万条数据(2)
    接上文,继续测试3000万条记录快速导入数据库。一、导入前1000万条数据清库、建库、新建表结构、导入前1000万条数据,结果:■1000万行,有2索引导入耗时:16分钟QueryOK,999......
  • MySQL快速导入千万条数据(1)
    对于传统的关系数据库如oracle,在大量数据导入方面的效率,我们一般有一个大概的认知,即1分钟以内可以导入千万条数据,而对于MySQL数据库,普遍观点以为性能相对较差,尤其时对于千......
  • MySQL PXC集群大事务提交超限
    研发人员在测试大事务提交时遇见了错误:Goterror5-'Transactionsizeexceedsetthreshold'duringCOMMIT测试了几次都是1200S的时候停止的,不过在注释掉特定步骤后,......
  • 基本的mysql语句
    基本的mysql语句  本节课先对mysql的基本语法初体验。操作文件夹(库)增createdatabasedb1charsetutf8;查#查看当前创建的数据库showcreatedatabase......
  • MySQL(三)+测试题
    MySQL索引在MySQL中,创建MySQL的索引主要是为了提⾼MySQL查询的效率。但是添加太多的索引也是会降低更新表的速度的,因为对表进⾏DML操作的时候,MySQL的内部不仅仅要保存数......
  • MySQL(四)-补充
    1、内查询:2种表示方法以testdev数据库的goods表和shop表为例:查询出goods表的name和shop表的name、level:第1种方法:第2种方法:2、创建表:ifnotexistscreatetablei......
  • MySql面试题总结
    1、having和where的区别解答:having子句用于分组后筛选,where子句用于行条件筛选where条件子句中不能使用聚集函数,而having子句就可以。having只能用在groupby之后,where......
  • springboot定时同步数据,从sqlserver到mysql
    定时同步数据,从sqlserver到mysql 注意事项:一.primary:master #设置默认的数据源或者数据源组,默认值即为master二.@Scheduled()和 @DS("slave_1")注解 步骤:1.......
  • MySQL4
    mysql5内链接   左连接1、先走内连接的逻辑2、再查询出左表所有的数据  select*fromgoodgleftjoinshopsong.id=s.good_id;  右链接  s......
  • linux环境搭建篇-安装mysql
    1.下载安装包方式一:手动下载并上传Linux下载mysql5.7的安装包,可以从官网下载https://downloads.mysql.com/archives/community  下载完成后将安装包上传到linux......