GreatSQL 并行Load Data加快数据导入
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=65536
或 SET 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 test ENGINE = MergeTree ORDER BY user_id AS SELECT number, concat('user_', toString(number)) AS user_id, concat('email_', toString(number), '@example.com') AS email, rand() AS random_value FROM numbers(1, 1000000); Query id: a707f30c-180f-4453-bc18-b8e86ee46059 Ok. 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.parts WHERE database IN ('mytest') GROUP BY table Query 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 test Query 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客户端的位置
不同情况下,是否开启并发耗时对比
未开启并发
| 单表数据量 | 表个数 | 总数据量 | 迁移CK表总大小 | 并行 | 用时(s) | | ---------- | ------ | -------- | -------------- | ---- | ------- | | 一百万 | 1 | 一百万 | 46.52 MiB | off | 21 | | 一千万 | 1 | 一千万 | 465.2 MiB | off | 188 | | 一百万 | 10 | 一千万 | 465.2 MiB | off | 211 | | 一百万 | 20 | 两千万 | 930.4MiB | off | 413 |
开启并发
| 单表数据量 | 表个数 | 总数据量 | 迁移CK表总大小 | 并行行程数 | 用时(s) | | ---------- | ------ | -------- | -------------- | ---------- | ------- | | 一百万 | 1 | 一百万 | 46.52 MiB | 16 | 10 | | 一千万 | 1 | 一千万 | 465.2 MiB | 16 | 120 | | 一百万 | 10 | 一千万 | 465.2 MiB | 16 | 97 | | 一百万 | 20 | 两千万 | 930.4MiB | 16 | 180 |
结论
从测试结果看,开启16并行线程,可以加快导入速度30%~50%,导入数据量越大,表数量越多,或者的优化效益越高。
提示:开启并发请注意服务器资源的使用。
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc
)好友,待社区助手拉您进群。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
什么是 OpenSSL?
原文链接:什么是 OpenSSL? 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在nginx.org.cn OpenSSL是一个加密库,是支持传输层安全防护(TLS)和安全套接字层(SSL)协议的开源实现。它提供了生成私钥、管理证书以及为客户端应用加密和解密的功能。 OpenSSL 被软件开发人员和系统管理员广泛用于在各种应用中实现安全通信和加密,如 web 服务器(像 NGINX)、电子邮件服务器、VPN 等。作为一个库,OpenSSL 可以集成到软件应用中,也可以用作各种加密操作的独立命令行工具。 用于安全应用交付的 OpenSSL 用例 OpenSSL 在安全应用交付策略中发挥着至关重要的作用,尤其是在确保通过网络传输数据的机密性、完整性和真实性方面。 它通常用于以下用例: 客户端和服务器之间的安全通信 数据加密 证书管理 数据完整性和身份验证 随机数生成 安全的协议和算法 安全的 web 服务器部署 OpenSSL 的优势 多年来,OpenSSL 一直是一个被广泛使用且已经建立好的加密库。虽然除了 OpenSSL 之外,还有其他的备选项,但 OpenSS...
- 下一篇
得物Flink内核探索实践
一、前言 随着大数据技术的飞速发展,实时处理能力变得越来越重要。在众多实时处理框架中,Apache Flink以其强大的流处理能力和丰富的功能集,受到了广泛关注和应用。在实时业务日益增长的趋势下,这促使我们深入探索Flink的内核,以更好地保障Flink任务的维护。本次分享将重点介绍得物在Flink内核方面的探索与实践,探讨如何通过深度优化和定制,实现更加高效和稳定的数据处理能力。 二、读者收益 通过阅读本次分享,读者将获得以下收益: 深入理解Flink内核:了解Flink的核心架构和关键组件,掌握Flink内核的运行机制。 优化实践:学习得物在Flink优化方面的实战经验,包括如何通过参数调优和内核定制,提升系统性能。 问题解决方案:掌握处理Flink常见问题的方法和技巧,提高在实际项目中应对复杂场景的能力。 实时处理案例:通过实际案例,了解如何在复杂业务场景中应用Flink,实现高效的实时数据处理。 最佳实践:获得得物在Flink应用中的最佳实践建议,帮助在实际项目中少走弯路,提高开发效率。 无论你是刚接触Flink的初学者,还是有一定经验的开发者,相信通过本次分享,都能有所收获,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7设置SWAP分区,小内存服务器的救世主
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群
- Mario游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程