我在 ClickHouse 中有一个简单的表,有 10M 行,定义如下:
CREATE TABLE monitor_data.syslogs
(
`id` UInt32,
`time` DateTime,
`priority` UInt8,
`message` String,
INDEX ngrambf_message_index message TYPE ngrambf_v1(5, 65536, 3, 37) GRANULARITY 256
)
ENGINE = MergeTree
PRIMARY KEY (time, id)
ORDER BY (time, id, priority)
SETTINGS index_granularity = 8192
我正在对其运行匹配查询,如下所示:
SELECT message FROM syslogs WHERE match(syslogs.message, 'lxstat');
我的问题是,这似乎根本没有跳过任何数据。这是输出:
集合中有 3900390 行。经过:6.016 秒。处理了 1000 万行, 777.80 MB(166 万行/秒,129.29 MB/秒。)峰值内存使用量:21.30 MiB。
以下是一些示例行:
9996. │ 17069 │ 2024-08-20 08:40:25 │ 13 │ lxstatusd: WLAN event: radio wifi0 station count: 5 │ 9997. │ 17069 │ 2024-08-20 08:40:25 │ 13 │ lxstatusd: WLAN event: radio wifi0 station count: 5 │
看起来索引没有任何效果,我希望它至少会跳过一些行,即使它定义得不好。
有什么想法吗?
谢谢!
你的
GRANULARITY
还差得很远。它不是行数,而是颗粒数(已经是 8,192 行)。所以你试图跳过 256*8192 = 2,097,152 行!这将很难跳过。
首先尝试将
GRANULARITY
设置为 1,然后如果您看到可以接受的结果,请尝试将其设置为 2 或 3。粒度越高,索引将很快变得无效。