微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clickhouse二级索引是否类似于MySQL普通索引?

如何解决Clickhouse二级索引是否类似于MySQL普通索引?

我对何时使用二级索引有点困惑。我有以下代码脚本来定义一个 MergeTree 表,该表有十亿行。

create table t_mt(
 id UInt8,name String,job String,birthday Date,salary UINT8

) engine = MergeTable
primary key id
order by (id)

我将实时运行以下聚合查询

select job,count(1),avg(salary) 
from t_mt 
group by job 
where salary > 20000

在上面的查询中,我使用了条件过滤器:salary > 20000 和 group by job。我想问一下在 salary 列上定义二级索引是否是一个好习惯。

在这里要问的基本问题是我是否可以将 Clickhouse 二级索引视为 MysqL 普通索引。也就是说,如果我想按某个列进行过滤,那么我可以在该列上创建(二级)索引以加快查询速度。

解决方法

不,MySQL 使用 b-tree 索引将随机查找降低到 O(log(N)) 复杂性,其中 N 是表中的行

Clickhouse 二级索引使用了另一种方法,它是数据跳过索引

当你尝试执行像 SELECT ... WHERE field [operation] values 这样的查询,其中包含来自二级索引的字段并且二级索引支持对 operation 应用的比较 field,clickhouse 将读取二级索引粒度和尝试快速检查数据部分是否可以跳过搜索值,如果没有,则clickhouse将从数据部分读取整列粒度

因此,二级索引不适用于具有高基数的列,而分区内的数据部分之间没有单调分布

查看https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-data_skipping-indexes了解详情

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。