myloader导入更快吗?并没有......

news/2024/11/24 7:08:01/
  • 0.结论先行
  • 1.背景介绍
  • 2.测试过程
  • 3.结果对比
  • 附录

myloader还默认禁用binlog了

0. 结论先行

重要结论先说:导入大批量数据时,采用GreatSQL 8.0.32-24中新增并行load data特性是最快的,关于该特性的描述详见:Changes in GreatSQL 8.0.32-24。

1. 背景介绍

前几天我用MySQL官网提供的airportdb库中的weatherdata表做测试,结论是相比原生快了约5倍。

群里有小伙伴反驳说用myloader更香,于是就有了本次测试。

由于weatherdata表较小,表空间只有228MB,所以我改用sysbench表做测试,该表共600万行数据,表空间约1.5GB,其他信息如下:

greatsql> show create table myload\G
*************************** 1. row ***************************Table: myload
Create Table:CREATE TABLE `myload` (`id` int NOT NULL AUTO_INCREMENT,`k` int NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `k_2` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=6194244 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;greatsql> show table status like 'myload'\G
*************************** 1. row ***************************Name: myloadEngine: InnoDBVersion: 10Row_format: DynamicRows: 5930876Avg_row_length: 233Data_length: 1385168896
Max_data_length: 0Index_length: 153894912Data_free: 7340032Auto_increment: 6194244Create_time: 2023-07-08 09:25:02Update_time: 2023-07-08 09:25:33Check_time: NULLCollation: utf8mb4_0900_ai_ciChecksum: NULLCreate_options:Comment:

2. 测试过程

本次测试基于GreatSQL 8.0.32-24版本,其他相关信息如下:

# myloader版本
$ myloader --version
myloader0.15.0-1, built against MySQL 5.7.42-46 with SSL support with GZIP# MySQL Shell版本JS > shell.version
Ver 8.0.32 for Linux on x86_64 - for MySQL 8.0.32 (MySQL Community Server (GPL))

默认开启binlog + 双1 + redo log + doublewrite buffer:

|binlog_rows_query_log_events |ON|
| innodb_buffer_pool_size | 8589934592|innodb_doublewrite |ON|
|innodb_flush_log_at_trx_commit |1|
|innodb_redo_log_capacity |2147483648|
|sync_binlog |1|

3. 结果对比

下面是几个不同导入方式的对比测试结果,每种方式我都测试至少3次,去除噪点数据后取平均值:

工具耗时(秒)binlog大小(MB)mysqld内存增长(MB)
原生load data62.80174110911536
并行load data(chunk=4MB,并发16线程)11.8110911522
myloader(dump时chunk=64MB,load时并发16线程)29.35822461868
myloader(dump时chunk=64MB,load时并发16线程)+ 关binlog21.426
myloader(默认 + 开binlog)82.6512246
myloader(默认 + 关binlog)62.830
util.importTable(默认,chunk=64MB,并发8线程)16.003410911662

从这个测试结果可以看到几个对比关系:

  1. 原生load data最慢,因为是单线程的,它的耗时是并行load data的5.32倍;
  2. 原生load data的耗时是多线程模式下myloader的2.14倍;
  3. 原生load data的耗时是多线程模式下util.importTable的3.92倍;
  4. 当myloader没有开启并行(mydumper备份时要先进行分配)的话,它的耗时是最久的,是并行load data的7倍,是多线程模式下util.importTable的5.16倍;
  5. 当myloader未开启binlog时(其默认行为,有"作弊"嫌疑),其耗时是并行load data的1.81倍,是多线程模式下util.importTable的1.34倍;
  6. 最后,myloader导入后造成的binlog文件最大,内存开销也最大。

file

综上,在MySQL 8.0/GreatSQL 8.0.32中,采用myloader导入数据就不再是最优方案了,推荐采用GreatSQL的并行load data,或者MySQL Shell的util.loadDump/util.importTable导入,其本质也是采用并行的思路,导入效率更高,额外的binlog和内存开销也更小。

最后,补充说下,myloader导入时产生的binlog更多,是因为它的导入方式是反复执行INSERT SQL,在 binlog_rows_query_log_events = ON 时,相比load data方式会产生更多binlog。

附录

1. myloader多分片方式导出

设置导出时进行分片,每个分片(chunk)10MB

$ mydumper -F 10 -S /data/GreatSQL/mysql.sock -T sbtest.myload -o /tmp/myload

最后的(未压缩)文件总大小为1.2GB。

2. outfile导出

greatsql> select * into outfile '/tmp/myload.csv' from myload;

很简单,平平无奇,最后的(未压缩)文件总大小为1.1GB。

3. util.dumpTables多分片方式导出 设置导出时进行分片,每个分片(chunk)64MB(默认值)

MySQL  localhost  JS > util.dumpTables("sbtest", ["myload"], "/tmp/myload", {threads:16, chunking:true, bytesPerChunk:"67108864"})

最后的(压缩后)文件总大小为505MB。

Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。


http://www.ppmy.cn/news/1067130.html

相关文章

c++查漏补缺(1)

目录 1.explicit关键字 2.static关键字 3.友元函数 1.explicit关键字 exeplicit关键字是在构造函数要使用的关键字。可以防止“隐式构造”&#xff0c;例如&#xff1a; #include<iostream>using namespace std;class Date { public:explicit Date(int year, int mo…

③matlab向量和矩阵

目录 手动输入数组 创建等间距向量 数组创建函数 手动输入数组 1.背景 单个称为标量的数值实际上是一个 11 数组&#xff0c;也即它包含 1 行 1 列。 任务 创建一个名为 x 并且值为 4 的变量。 2.您可以使用方括号创建包含多个元素的数组。 x [3 5] x 3 5 任务 …

AIGC时代开启!拓世数字人短视频点燃企业数字化转型热潮!

短视频在近年迎来了高速发展期&#xff0c;与初期满足人们的娱乐需求和社交需求相比&#xff0c;短视频平台如今已经成长为一个巨量信息汇聚、流转、辐散的综合性场所。特别是随着移动互联网的普及&#xff0c;碎片化信息传播需求的迅猛增长&#xff0c;各行各业的内容创作者都…

postgresql 内核源码分析 btree索引的增删查代码基本原理流程分析,索引膨胀的原因在这里

B-Tree索引代码流程分析 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&…

oppo手机怎么录屏?录制屏幕,就看这里!

“有人知道oppo手机怎么录屏吗&#xff0c;前几年买的oppo手机&#xff0c;用到现在感觉挺流畅的&#xff0c;也不是很卡顿&#xff0c;最近听说我这个型号的手机也有录屏功能&#xff0c;但是我不知道怎么打开&#xff0c;就想问问大伙&#xff0c;oppo手机怎么录屏呀。” 在…

水库大坝北斗RTK位移自动监测系统方案

一、方案背景 我国已拥有水库大坝9.8万余座&#xff0c;其中95%以上为土石坝&#xff0c;95%以上是上个世纪80年代以前建设的老坝。虽然近10年来我国进行了大规模的病险水库除险加固&#xff0c;但水库大坝数量多&#xff0c;土石坝多&#xff0c;出险的几率非常高。大坝作为一…

java反射获取对象的方法

invoke() 方法是 Java 反射机制中一个重要的方法&#xff0c;用于调用已获取的反射对象&#xff08;如 Method、Constructor&#xff09;代表的方法或构造函数。 通过 invoke() 方法可以在运行时动态地调用指定对象的方法或创建对象实例。它接受两个参数&#xff1a;第一个参数…

【VMware】CentOS 设置静态IP(Windows 宿主机)

文章目录 1. 更改网络适配器设置2. 配置虚拟网络编辑器3. 修改 CentOS 网络配置文件4. ping 测试结果 宿主机&#xff1a;Win11 22H2 虚拟机&#xff1a;CentOS-Stream-9-20230612.0 (Minimal) 1. 更改网络适配器设置 Win R&#xff1a;control 打开控制面板 依次点击&#x…