优化Key顺序提升ClickHouse查询性能

news2024/11/28 20:58:33

ClickHouse 键列顺序不仅影响表压缩效果,对查询性能也有很大影响,正确使用键列的顺序可以跳过大粒度数据范围,提高查询效率。本文通过示例进行测试不同场景的查询性能,从而让我们了解如何选择键列及其顺序。

测试数据

首先创建并生成表数据,用于测试:

CREATE TABLE default.test (`a` String, `b` String, `c` String)
ENGINE = MergeTree ORDER BY (a, b, c);

INSERT INTO test SELECT
    round(number / 100000), round(number / 1000), number
FROM numbers(50000000);
SELECT    uniq(a),    uniq(b),    uniq(c) FROM test;

显示结果:

┌─uniq(a)─┬─uniq(b)─┬──uniq(c)─┐
│     501 │   50001 │ 50148092 │
└─────────┴─────────┴──────────┘

我们看到每列的基数不同,因为插入数据时分母逐次变小,基数结果自然逐步增大。

因为order键的顺序位(a->b->c), 下面测试基于每列执行查询测试性能:

yfjd-990 :) select count(*) from test where a = '10000';

SELECT count(*)
FROM test
WHERE a = '10000'

返回结果:

Query id: 2105628f-252f-4d12-8cc0-4eeac10b3042

┌─count()─┐
│       0 │
└─────────┘

1 rows in set. Elapsed: 0.007 sec. Processed 8.19 thousand rows, 98.30 KB (1.16 million rows/s., 13.88 MB/s.)

扫描了8千多行,使用0.007 秒

再看b列的查询情况:

yfjd-990 :) select count(*) from test where b = '100';

SELECT count(*)
FROM test
WHERE b = '100'

返回结果:

Query id: 2af64765-5eac-4993-b977-b7fbc77f4e9b

┌─count()─┐
│    1001 │
└─────────┘
1 rows in set. Elapsed: 0.023 sec. Processed 4.10 million rows, 56.53 MB (178.16 million rows/s., 2.45 GB/s.)

扫描了4百多万行,用了0.023 秒。慢了三倍多,扫描记录也增加了很多。

最后测试c列查询:

yfjd-990 :) select count(*) from test where c = '10000';

SELECT count(*)
FROM test
WHERE c = '10000'

返回结果:

Query id: 593aa69c-f83a-475b-aa04-063c20ed0aa4

┌─count()─┐
│       1 │
└─────────┘

1 rows in set. Elapsed: 0.122 sec. Processed 50.00 million rows, 838.89 MB (409.89 million rows/s., 6.88 GB/s.)

扫描了5千万行,使用了0.122 秒,进行了全表扫描,速度最慢。

对比三个查询,我们看到a列仅扫描8k多行,c列进行全表扫描,这是因为数据采用下面结果进行存储:
在这里插入图片描述

二分搜索与通用排除算法

当我们使用主键的所有列或第一列(前缀),ClickHouse采用高效的二分查找算法基于主键定位所需的粒度。

在这里插入图片描述
但如果跳过主键的第一列,仅使用右边部分(从索引的第二列开始),ClickHouse使用通用排除搜索算法:
在这里插入图片描述

该方法非常简单,我们知道ClickHouse主键按粒度组织数据。ClickHouse尝试过滤不包含目标值的粒度:

在这里插入图片描述

Clickhouse尝试排除不包含搜索值的粒度,通过检查目标列在每个粒度中的最大、最小值,然后跳过没在min…max范围内的粒度。

通用排除搜索性能

通用排除跳过粒度越大性能越好,可以通过让索引前缀包括更多重复值(基数更小),基数越大跳过粒度越多。这就是为什么将基数低的列放在键前面,使得二级索引列上查询效率更高。下面比较使用高基数列作为索引的第一列时的性能:

INSERT INTO test (b, c, a) SELECT
    round(number / 100000),
    round(number / 1000),
    number
FROM numbers(50000000)

查看每列的基数:

SELECT    uniq(a),    uniq(b),    uniq(c) FROM test;

┌──uniq(a)─┬─uniq(b)─┬─uniq(c)─┐
│ 50148092 │     501 │   50001 │
└──────────┴─────────┴─────────┘

现在测试性能:

select count(*) from test where b = '100';

结果如下:


yfjd-990 :) select count(*) from test where b = '100';

SELECT count(*)
FROM test
WHERE b = '100'

Query id: 8df66645-3323-4973-a64e-c36eb95e407f

┌─count()─┐
│  100001 │
└─────────┘

1 rows in set. Elapsed: 0.195 sec. Processed 50.00 million rows, 589.10 MB (256.38 million rows/s., 3.02 GB/s.)

这次ClickHouse不能有效过滤粒度,不得不执行全表扫描。因此,在表中拥有完全相同的数据、且执行相同的查询会导致10倍的性能差异,这取决于关键列的顺序:
在这里插入图片描述

总结

如果不确定order键顺序,使用低基数列作为第一列,高基数列作为最后列,从而确保第二索引列的查询性能。参考文档:https://medium.com/datadenys/improving-clickhouse-query-performance-tuning-key-order-f406db7cfeb9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从DY用户页面获取作品列表

最近DY的web端更新比较频繁,所以搞了很多方案来应对更新问题。 本文内容是其中一种方案,从用户主页的HTML响应内容中抽取user信息和作品列表数据。 下图中出现的内容都是在html名为RENDER_DATA的script标签中,以urlencode编码。 比如昵称、粉…

copilot技巧

copilot技巧 csdn排版不太好,推荐notion查看:https://superb-face-6ae.notion.site/copilot-25cf0f9882364056b5c76909b3a66ef9 一些基础原理: 我们想要使用copilot来干嘛呢?来生成代码。 怎样让它生成代码呢?给它一…

【PyTorch】第七节:数据加载器

作者🕵️‍♂️:让机器理解语言か 专栏🎇:PyTorch 描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语💓:🐾没有白走的路,每一步都算数&#…

GitHub收藏夹分类列表

前言 GitHub是一个基于Git的国际代码托管网站,其内容质量较高,用户在浏览时经常会收藏他人的项目,当收藏的项目越来越多后,用户再想查找之前特定的收藏项目会非常困难。 因此我们希望分类管理GitHub收藏夹,值得注意的…

Golang每日一练(leetDay0034) 二叉树专题(3)

目录 100. 相同的树 Same Tree 🌟 101. 对称二叉树 Symmetric Tree 🌟 102. 二叉树的层序遍历 Binary Tree Level-order Traversal 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一…

pdf怎么转换ppt格式,两个方法转换

PDF作为一种常用的文件格式,被大众所熟悉。虽然PDF具备的稳定性,安全性,以及很强的兼容性可以让我们更方便顺畅的阅读PDF文件,但若是有需要展示PDF文件内容的时候,其优点就没有那么凸显了,这时还是将pdf转换…

数据结构与算法基础(王卓)(25)线性表的查找(1):顺序查找(线性查找)

基本基础概念: 看这就不用去翻PPT了 查找: 根据给定的某个值,在查找表中确定一个与其关键字等于给定值的数据元素(或记录) 关键字: 用来表示一个数据元素(或记录)的某个数据项的值 主…

系统安全与应用【下】

文章目录1.开关机安全控制1.1 GRUB限制1.2 实例:GRUB 菜单设置密码2.终端登录安全控制2.1 限制root只在安全终端登录2.2 禁止普通用户登录3.弱口令检测3.1 Joth the Ripper,JR4.网络端口扫描4.1 nmap命令1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情…

读懂MAC地址

MAC地址是一种用于标识计算机网络设备的唯一地址。它是由48个二进制数字组成的,通常表示为12个十六进制数字,每两个数字之间用冒号或连字符分隔开。MAC地址由设备制造商在生产过程中分配,以确保网络上每个设备都有唯一的标识符。 MAC地址的规…

投影仪怎么连接电脑?快来看看这3种方法!

案例:如何连接电脑和投影仪? 【想看电影,但是电脑屏幕太小,我想把电脑上的内容通过投影仪投到大屏幕上。有小伙伴知道如何连接电脑和投影仪吗?谢谢大家!】 使用投影仪可以将电脑或其他设备上的内容投放到…

Java——矩形覆盖

题目链接 牛客在线oj题——矩形覆盖 题目描述 我们可以用 21 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 21 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法? 数据范围:0≤n≤38 进阶&#xff1…

九龙证券|啤酒龙头一季度净利暴增逾70倍!钛白粉开启年内第三次涨价

业内人士遍及认为,随着下流需求逐渐改进,钛白粉职业景气量有望恢复。 燕京啤酒昨日晚间发布一季度成绩预告,公司2023年一季度预计完成归母净利润6200万至6600万元,同比增加7076.76%至7539.77%。对于成绩变动的原因,燕京…

K8s为什么要放弃Docker

公司定期分享整理的资料 放弃始由 https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation 2020 年,k8s 1.20 终于正式向 Docker “宣战”:kubelet将弃用 Docker 支持,并将在未来的版本中完全移除。…

Linux高性能服务器编程|阅读笔记:第1章 - TCP/IP协议族

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

CLIMS:弱监督语义分割的跨语言图像匹配

文章目录CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation摘要方法语言图像匹配框架实验结果CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation 摘要 存在的问题 CAM(类激活图)通常只激活有区别的对象区…

第二章 数据类型与变量

文章目录1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 语法格式3.3 整形变量3.3.1 int整型变量(4 个字节)3.3.2 long长整型变量(8 个字节)3.3.3 short短整型变量(2 个字节)3.3.4 byte字节型变量(1个字节)3.4 浮点型变量3.4.1 do…

图片的四个角怎么做成圆弧形,2种方法分享

图片的四个角怎么做成圆弧形?今天来说一说直角和圆弧,小伙伴们可能会疑惑了,怎么今天讲的内容和之前不一样啊,不要着急干货在后面,听我娓娓道来。相信很多小伙伴们都使用过iphone手机,每年的产品发布会都会…

用高中生的思维写一篇MATLAB入门

文章目录一、简介二、MATLAB的工作界面三、基本语句1、if语句2、switch语句3、try语句4、for语句和while语句5、break语句和continus语句四、数值运算1、基本算术运算2、format命令3、关系运算4、逻辑运算5、特殊变量和常数6、数学函数五、二维平面绘图1、关于颜色和数据标记点…

微积分——用积分定义自然对数的动机

第6章 对数函数&#xff0c;指数函数和反三角函数 目录 第6章 对数函数&#xff0c;指数函数和反三角函数 6.1 引言 6.2 用积分定义自然对数的动机 内容来源&#xff1a;<> Tom M. Apostol 6.1 引言 每当有人将他的注意力集中到数量关系的时候&#xff0c;他要么是…

NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034

然后我们继续来看,如果需要同步,当然需要先开启mysqlbin log日志了 可以看到开启操作 在windows和linux上开启binlog日志 然后看一下 在windows上开启mysql的binlog的方法