我正在 Clickhouse 数据库中创建一个新表,例如:
CREATE TABLE IF NOT EXISTS `sensor_reading`
(
test_day Date,
sensor String,
ts DateTime,
speed Int32,
weight Int32,
)
ENGINE=MergeTree()
PARTITION BY test_day
ORDER BY (test_day, sensor, ts)
PRIMARY KEY (test_day, sensor, ts);
键
sensor
的值空间比test_day
低得多,我想将它用作第1个主键,因此clickhouse可以通过二分搜索对其进行索引。既然表是按test_day
分区的,是否还需要将其放入ORDER BY
或PRIMARY KEY
列表中呢?应该改成ORDER BY (sensor, ts)
还是ORDER BY (sensor, test_day, ts)
?
编辑:我的大多数查询都带有过滤器,例如
WHERE test_day = '2024-10-01' AND sensor = 'A' AND ts BETWEEN ...
不,
PARTITION BY
可能是完全不同的字段,与ORDER BY
或PRIMARY KEY
中的
CREATE TABLE
子句无关
在 INSERT 期间使用 PARTITION BY 子句将行拆分为不同的数据部分,不同分区中的数据部分永远不会合并
在 SELECT 过程中使用 PARTITION BY 子句来快速过滤与查询无关的数据部分,以避免不必要的磁盘读取
看https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/ 欲知详情