Clickhouse二级索引和MySQL普通索引类似吗?

Tom*_*Tom 2 clickhouse

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

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

) engine = MergeTable
primary key id
order by (id)
Run Code Online (Sandbox Code Playgroud)

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

select job, count(1), avg(salary) 
from t_mt 
group by job 
where salary > 20000
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

不,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