我对何时使用二级索引有点困惑。我有以下代码脚本来定义 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将从数据部分读取整列颗粒
因此,二级索引不适用于分区内数据部分之间没有单调分布的高基数列
| 归档时间: |
|
| 查看次数: |
2510 次 |
| 最近记录: |