翼度科技»论坛 编程开发 mysql 查看内容

GreatSQL 并行Load Data加快数据导入

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
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 语法
  1. LOAD DATA
  2.     [LOW_PRIORITY | CONCURRENT] [LOCAL]
  3.     INFILE 'file_name'
  4.     [REPLACE | IGNORE]
  5.     INTO TABLE tbl_name
  6.     [PARTITION (partition_name [, partition_name] ...)]
  7.     [CHARACTER SET charset_name]
  8.     [{FIELDS | COLUMNS}
  9.         [TERMINATED BY 'string']
  10.         [[OPTIONALLY] ENCLOSED BY 'char']
  11.         [ESCAPED BY 'char']
  12.     ]
  13.     [LINES
  14.         [STARTING BY 'string']
  15.         [TERMINATED BY 'string']
  16.     ]
  17.     [IGNORE number {LINES | ROWS}]
  18.     [(col_name_or_user_var
  19.         [, col_name_or_user_var] ...)]
  20.     [SET col_name={expr | DEFAULT}
  21.         [, col_name={expr | DEFAULT}] ...]
复制代码
GreatSQL开启load data并行的方法
  1. #并行load data默认关闭,需要手动开启
  2. show variables like '%gdb_parallel_load%';
  3. +------------------------------+---------+
  4. | Variable_name                | Value   |
  5. +------------------------------+---------+
  6. | gdb_parallel_load            | OFF     |
  7. | gdb_parallel_load_chunk_size | 4194304 |
  8. | gdb_parallel_load_workers    | 6       |
  9. +------------------------------+---------+
  10. 3 rows in set (0.03 sec)
复制代码
方法一:设置session变量

连接数据库,执行set session gdb_parallel_load=on
如需调整文件块大小或线程数,执行 SET SESSION gdb_parallel_load_chunk_size=65536 或 SET SESSION gdb_parallel_load_workers=16。
使用原load data语句执行导入。
方法二:load语句增加hint
  1. 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
测试数据创建
  1. #Clickhouse制造测试数据
  2. #建表并随机生成1000000行数据插入
  3. CREATE TABLE test
  4. ENGINE = MergeTree
  5. ORDER BY user_id AS
  6. SELECT
  7.     number,
  8.     concat('user_', toString(number)) AS user_id,
  9.     concat('email_', toString(number), '@example.com') AS email,
  10.     rand() AS random_value
  11. FROM numbers(1, 1000000);
  12. Query id: a707f30c-180f-4453-bc18-b8e86ee46059
  13. Ok.
  14. 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.)
  15. Peak memory usage: 157.29 MiB.
  16. #查看表数据库和大小
  17. SELECT
  18.     table AS `表名`,
  19.     sum(rows) AS `总行数`,
  20.     formatReadableSize(sum(data_uncompressed_bytes)) AS `原始大小`,
  21.     formatReadableSize(sum(data_compressed_bytes)) AS `压缩大小`,
  22.     round((sum(data_compressed_bytes) / sum(data_uncompressed_bytes)) * 100, 0) AS `压缩率`
  23. FROM system.parts
  24. WHERE database IN ('mytest')
  25. GROUP BY table
  26. Query id: c107871c-d58d-41ff-9bb9-603ab5ad57c9
  27. ┌─表名─┬──总行数─┬─原始大小──┬─压缩大小──┬─压缩率─┐
  28. │ test │ 1000000 │ 46.52 MiB │ 16.29 MiB │     35 │
  29. └──────┴─────────┴───────────┴───────────┴────────┘
  30. 1 row in set. Elapsed: 0.010 sec.
  31. SELECT count(*) FROM test
  32. Query id: 0e49726f-75d2-402f-a83d-1c1534489b51
  33. ┌─count()─┐
  34. │ 1000000 │
  35. └─────────┘
  36. 1 row in set. Elapsed: 0.004 sec.
复制代码
创建GreatSQL库对应库表结构
  1. greatsql> CREATE TABLE `mytest1`.`test` (  
  2.     `number`  BIGINT PRIMARY KEY,
  3.     `user_id` VARCHAR(255),  
  4.     `email` VARCHAR(255),  
  5.     `random_value`  INT  
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码
导出导入语句样例
  1. Clickhouse导出
  2. {ck_cmd} -q 'SELECT * FROM table FORMAT CSV #{ck_cmd}为clickhouse-client的位置
  3. GreatSQL导入
  4. {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 ','"
  5. #{gdb_cmd}为greatsql客户端的位置
复制代码
不同情况下,是否开启并发耗时对比

未开启并发
单表数据量表个数总数据量迁移CK表总大小并行用时(s)一百万1一百万46.52 MiBoff21一千万1一千万465.2 MiBoff188一百万10一千万465.2 MiBoff211一百万20两千万930.4MiBoff413开启并发
单表数据量表个数总数据量迁移CK表总大小并行行程数用时(s)一百万1一百万46.52 MiB1610一千万1一千万465.2 MiB16120一百万10一千万465.2 MiB1697一百万20两千万930.4MiB16180结论

从测试结果看,开启16并行线程,可以加快导入速度30%~50%,导入数据量越大,表数量越多,或者的优化效益越高。
提示:开启并发请注意服务器资源的使用。

Enjoy GreatSQL
来源:https://www.cnblogs.com/greatsql/p/18358294
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具