写点什么

GreatSQL 并行 Load Data 加快数据导入

作者:GreatSQL
  • 2024-08-14
    福建
  • 本文字数:2170 字

    阅读完需:约 7 分钟

GreatSQL 并行 Load Data 加快数据导入

数据库信息

数据库版本:GreatSQL 8.0.32-25


Clickhouse 表需要导入到 GreatSQL 中,表数据量庞大所以选用导出 CSV 的方式。


测试数据复现操作

load data

MySQL load data 语句能快速将一个文本文件的内容导入到对应的数据库表中(一般文本的一行对应表的一条记录)。数据库应用程序开发中,涉及大批量数据需要插入时,使用 load data 语句的效率比一般的 insert 语句的高很多可以看成select … into outfile语句的反操作,select … into outfile将数据库表中的数据导出保存到一个文件中。

load data 语法

LOAD DATA    [LOW_PRIORITY | CONCURRENT] [LOCAL]    INFILE 'file_name'    [REPLACE | IGNORE]    INTO TABLE tbl_name    [PARTITION (partition_name [, partition_name] ...)]    [CHARACTER SET charset_name]    [{FIELDS | COLUMNS}        [TERMINATED BY 'string']        [[OPTIONALLY] ENCLOSED BY 'char']        [ESCAPED BY 'char']    ]    [LINES        [STARTING BY 'string']        [TERMINATED BY 'string']    ]    [IGNORE number {LINES | ROWS}]    [(col_name_or_user_var        [, col_name_or_user_var] ...)]    [SET col_name={expr | DEFAULT}        [, col_name={expr | DEFAULT}] ...]
复制代码

GreatSQL 开启 load data 并行的方法

#并行load data默认关闭,需要手动开启 show variables like '%gdb_parallel_load%';+------------------------------+---------+| Variable_name                | Value   |+------------------------------+---------+| gdb_parallel_load            | OFF     || gdb_parallel_load_chunk_size | 4194304 || gdb_parallel_load_workers    | 6       |+------------------------------+---------+3 rows in set (0.03 sec)
复制代码

方法一:设置 session 变量

连接数据库,执行set session gdb_parallel_load=on如需调整文件块大小或线程数,执行 SET SESSION gdb_parallel_load_chunk_size=65536SET SESSION gdb_parallel_load_workers=16。使用原 load data 语句执行导入。

方法二:load 语句增加 hint

LOAD /*+ SET_VAR(gdb_parallel_load=ON) SET_VAR(gdb_parallel_load_chunk_size=65536) SET_VAR(gdb_parallel_load_workers=16) */ DATA INFILE '$MYSQLTEST_VARDIR/parallel_load_outfile.txt' INTO TABLE t1;
复制代码


  • gdb_parallel_load 是否开启并行

  • gdb_parallel_load_chunk_size 文件块大小

  • gdb_parallel_load_workers 开启多少个线程同时导入


开启 gdb_parallel_load=ON。默认配置是 gdb_parallel_load_chunk_size=4194304,gdb_parallel_load_workers=6

测试数据创建

#Clickhouse制造测试数据#建表并随机生成1000000行数据插入CREATE TABLE testENGINE = MergeTreeORDER BY user_id ASSELECT    number,    concat('user_', toString(number)) AS user_id,    concat('email_', toString(number), '@example.com') AS email,    rand() AS random_valueFROM numbers(1, 1000000); Query id: a707f30c-180f-4453-bc18-b8e86ee46059Ok.0 rows in set. Elapsed: 0.575 sec. Processed 1.00 million rows, 8.00 MB (1.74 million rows/s., 13.92 MB/s.)Peak memory usage: 157.29 MiB.#查看表数据库和大小SELECT    table AS `表名`,    sum(rows) AS `总行数`,    formatReadableSize(sum(data_uncompressed_bytes)) AS `原始大小`,    formatReadableSize(sum(data_compressed_bytes)) AS `压缩大小`,    round((sum(data_compressed_bytes) / sum(data_uncompressed_bytes)) * 100, 0) AS `压缩率`FROM system.partsWHERE database IN ('mytest')GROUP BY tableQuery id: c107871c-d58d-41ff-9bb9-603ab5ad57c9┌─表名─┬──总行数─┬─原始大小──┬─压缩大小──┬─压缩率─┐│ test │ 1000000 │ 46.52 MiB │ 16.29 MiB │     35 │└──────┴─────────┴───────────┴───────────┴────────┘1 row in set. Elapsed: 0.010 sec. 
SELECT count(*) FROM testQuery id: 0e49726f-75d2-402f-a83d-1c1534489b51┌─count()─┐│ 1000000 │└─────────┘1 row in set. Elapsed: 0.004 sec.
复制代码

创建 GreatSQL 库对应库表结构

greatsql> CREATE TABLE `mytest1`.`test` (      `number`  BIGINT PRIMARY KEY,     `user_id` VARCHAR(255),      `email` VARCHAR(255),      `random_value`  INT  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码

导出导入语句样例

Clickhouse导出{ck_cmd} -q 'SELECT * FROM table FORMAT CSV #{ck_cmd}为clickhouse-client的位置GreatSQL导入{gdb_cmd} -e "LOAD  /*+ SET_VAR(gdb_parallel_load=ON) SET_VAR(gdb_parallel_load_chunk_size=65536) SET_VAR(gdb_parallel_load_workers=16) */ DATA LOCAL INFILE 'table.csv' INTO TABLE {new_table} fields terminated by ','"#{gdb_cmd}为greatsql客户端的位置
复制代码

不同情况下,是否开启并发耗时对比

未开启并发



开启并发


结论

从测试结果看,开启 16 并行线程,可以加快导入速度 30%~50%,导入数据量越大,表数量越多,或者的优化效益越高。


提示:开启并发请注意服务器资源的使用。


用户头像

GreatSQL

关注

GreatSQL社区 2023-01-31 加入

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。 社区:https://greatsql.cn/ Gitee: https://gitee.com/GreatSQL/GreatSQL

评论

发布
暂无评论
GreatSQL 并行Load Data加快数据导入_GreatSQL_InfoQ写作社区