ClickHouse:如何在ClickHouse中使用“Data Skipping Indexes”和“Manipulations With Data Skipping Indices”功能?

7

我正在使用ClickHouse的Data Skipping Indexes功能,但对其用法感到困惑。如果在创建表时像下面这样添加数据跳过索引:

CREATE TABLE MyTable
(
    ...
    INDEX index_time TimeStamp TYPE minmax GRANULARITY 1
)
ENGINE =MergeTree()
...

当我使用 TimeStamp 过滤条件进行查询时,'index_time' 可以工作。但是如果在创建表时未添加索引,那么可以使用 数据跳过索引操作 功能添加索引,例如:

ALTER TABLEE MyTable ADD INDEX index_time TimeStamp TYPE minmax GRANULARITY 1

那么索引“index_time”无法工作。

我的数据库正在生产环境中运行,所以我无法重新创建表格。我必须使用第二种方式。有人可以解释一下为什么它不起作用或者我使用该功能的方式不正确吗?


我找到了解决方案。请查看此链接:https://github.com/yandex/ClickHouse/issues/6561 - Rujiang Ding
2个回答

7

在使用ALTER TABLE ADD INDEX添加索引后,你的查询未使用索引的原因是索引还不存在。(!)

任何新数据都将被正确索引,这就是为什么在CREATE TABLE中添加索引时索引起作用的原因。ClickHouse在加载数据时构建索引。如果您创建了表,运行ALTER TABLE ADD INDEX并加载数据,则会看到相同的行为。

当数据已经存在时,情况就不同了。ALTER TABLE更新表的元数据,但此时所有数据都已写入表中的部分。ClickHouse不会自动重写部分以实现新的索引。但是,您可以通过运行以下命令来强制重写以包括索引:

OPTIMIZE TABLE MyTable FINAL 

查看由Ruijang提供的更多信息,请参见https://github.com/yandex/ClickHouse/issues/6561 GitHub问题。

3

很正确,

OPTIMIZE TABLE my_table_name FINAL;

重新创建索引集,并不会影响到表格中的数据。但是,在某些列式数据库场景下,我们希望避免重写所有数据。如果您只是在已经存在大量数据的表格中添加单个索引,那么仅需要执行两个步骤即可重建新的索引:

第一步 - 定义索引

创建索引本身只是定义了索引应该如何工作,这在Clickhouse中体现为添加到表格中的元数据。因此,实际上并没有构建索引,因此也不会加快任何操作。这也是轻量级操作,因为除了表格元数据外,它不会改变数据或构建任何结构。

需要注意的是,任何新进入的数据都将在插入时进行索引,但不包括任何预先存在的数据!

ALTER TABLE my_table_name ADD INDEX my_index(my_expression) TYPE minmax GRANULARITY 1


注意,Clickhouse可以索引表达式,因此它可以简单地是问题中的列名或更复杂的表达式(例如my_index(price * sold_items * revshare))。当然,索引仅适用于该表达式。
步骤2-建立(实现)索引
在创建元数据后,需要构建现有数据的索引。这个动作被称为materialize,需要明确触发。好处是您可以针对添加或更改的任何索引单独执行此操作。由于这将在数据库上触发工作,因此这是一个重要的操作。
ALTER TABLE my_table_name MATERIALIZE INDEX my_index;

请参阅Clickhouse文档中有关“跳过索引操作”的内容Manipulating Data Skipping Indices


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接