首页 > 其他分享 >myloader导入更快吗?并没有......

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

时间:2023-08-28 10:02:16浏览次数:50  
标签:load binlog ...... GreatSQL myloader myload 导入 data

  • 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: myload
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 5930876
 Avg_row_length: 233
    Data_length: 1385168896
Max_data_length: 0
   Index_length: 153894912
      Data_free: 7340032
 Auto_increment: 6194244
    Create_time: 2023-07-08 09:25:02
    Update_time: 2023-07-08 09:25:33
     Check_time: NULL
      Collation: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_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 data 62.801741 1091 1536
并行load data(chunk=4MB,并发16线程) 11.81 1091 1522
myloader(dump时chunk=64MB,load时并发16线程) 29.358 2246 1868
myloader(dump时chunk=64MB,load时并发16线程)+ 关binlog 21.426
myloader(默认 + 开binlog) 82.651 2246
myloader(默认 + 关binlog) 62.830
util.importTable(默认,chunk=64MB,并发8线程) 16.0034 1091 1662

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

  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

标签:load,binlog,......,GreatSQL,myloader,myload,导入,data
From: https://www.cnblogs.com/greatsql/p/17661482.html

相关文章

  • myloader导入更快吗?并没有......
    0.结论先行1.背景介绍2.测试过程3.结果对比附录myloader还默认禁用binlog了0.结论先行重要结论先说:导入大批量数据时,采用GreatSQL8.0.32-24中新增并行loaddata特性是最快的,关于该特性的描述详见:ChangesinGreatSQL8.0.32-24。1.背景介绍前几天我用MySQL官网提......
  • 向es中导入数据的几个方式
    方式一,使用kibana控制台添加(该方式数据量有上限,批量导入推荐CURL)该方式需要安装kibana,启动后打开控制台http://kibana部署IP:5601/app/dev_tools#/consolePOST_bulk{"index":{"_index":"test_goods","_type":"goods","_id":10001}}{"code&q......
  • easypoi导入导出字段字典码值自动转换
    1.replace进行内容替换@Excel(name="是否有效",width=30,replace={"是_1","否_0","_null"})privateStringisEffective;Excel文件内'是否有效'这列的数据将会根据replace规则替换,例如'是'会被替换为'1',空白会被替换为null。反过来导出数据到E......
  • .NetCore WebAPI 导入、导出Excel文件 导入
    先下载一个NuGet包 在接口写方法//导入[HttpPost][Route("Import")]publicIActionResultImportExcel()//IFormFileformFile{try{varformFile=HttpContext.Request.Form.Files[0];//......
  • Excel导入与导出
    1、下载NuGet包 2、在API中创建一个文件夹,写一个Excel模版 3、在浏览器查看,需要使用中间件UseStaticFiles 4、在控制器中书写导入、导出方法;代码如下所示:1///<summary>2///Excel导入3///</summary>4///<returns></retu......
  • vue3中组件,api的自动导入
    vue3中ref,reactive等api和自定义组件等每个页面都要引入很麻烦,偷懒是人的天性,故引入自动导入插件,以此记录:1.vue3的api自动导入使用前:<scriptsetuplang="ts">import{ref,onMounted}from'vue'constimgUrl=ref("")constcanvas=ref()onMounted(()=>......
  • 导入导出(Excel)vue
     导入导出(Excel)首先 vue安装插件 (最后有完整代码)npm install xlsx file-saver其次:简单的导出按钮代码:<template>  <div>    <el-button type="primary" @click="exportExcel">导出 Excel</el-button>    <input      type="file&qu......
  • mysql导入sql文件“Index column size too large. The maximum column size is 767 by
    问题分析由于MySQL的InnoDB引擎表索引字段长度的限制为767字节,因此对于多字节字符集的大字段或者多字段组合,创建索引时会出现该问题。说明注:以utf8mb4字符集字符串类型字段为例。utf8mb4是4字节字符集,默认支持的索引字段最大长度是191字符(767字节/4字节每字符......
  • PPT一键导入秒变视频?你没听错!有了这个神器,让你的PPT从基础到高级,转化为视频就像变魔术
    我们都知道PPT是一个绝对实用的工具,可以帮助我们展示演讲、产品介绍、项目计划等等。但是有时候,我们想把PPT变成视频的形式,这样更容易传播和分享啦!   那么你会制作PPT吗?你在使用中有遇到过一些困难吗?让我给你看看我身边几位朋友对PPT的感受吧! 企业朋友A说:......
  • .Net Core使用miniExcel实现导入导出
    .NetCore使用miniExcel实现导入导出首先,引入NuGet包:MiniExcel第三方插件一、导入    publicintUpLoadExecl()   {      //获取文件数据,[0]代表只能上传一个文件,如果要传递多个文件注意:文件名不能重复      varformInfor=HttpCo......