【问题标题】:Is Clickhouse secondary index similar to MySQL normal index?Clickhouse二级索引和MySQL普通索引类似吗?
【发布时间】:2021-09-21 13:56:43
【问题描述】:

我对何时使用二级索引有点困惑。我有以下代码脚本来定义一个 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 普通索引。也就是说,如果我想按某个列进行过滤,那么我可以在该列上创建(二级)索引以加快查询速度。

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    使用按 (salary, id) 排序的物化视图(当您将行写入原始表时会自动填充)可以有效地实现 clickhouse 中的此类行为。按薪水查询会比跳过索引快得多。

    create materialized  view t_mt_by_salary partition by toYear(birthday) order by (salary, id)
     populate  as select  id, name , job , birthday , salary from t_mt;
    select * from t_mt_by_salary where salary > 20000
    

    没有必要使用 MySQL 类型的二级索引,因为在这些类型的查询中,像 clickhouse 这样的列式 OLAP 比 MySQL 快得多。加载二级索引并进行查找在理论上可以解决 O(N log N) 复杂度,但在实践中可能并不比完全扫描好,因为您遇到了磁盘查找的瓶颈。

    如果您的查询中有一些稀有值或数据中有额外结构(与索引相关),则跳过索引(clickhouse 二级索引)会有所帮助。例如。让我们假设您过滤的薪水 >200000 但 99.9% 的薪水低于 200000 - 然后跳过索引告诉您,例如下一个区块的最高工资是19400,所以你不需要阅读这个区块。

    另一方面,如果您需要加载大约 5% 的数据,随机分布在 8000 行颗粒(块)中,那么您可能需要扫描几乎所有颗粒。但是您仍然可以使用按薪水排序的物化视图进行非常快速的查询。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 2019-10-27
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 2015-10-29
        相关资源
        最近更新 更多