Timescale Cloud:性能、规模、企业级
自托管产品
MST
由于查找数据可能需要很长时间,特别是当您的超表中数据量很大时,您可以使用索引来加快从行存储中未压缩块的读取操作(这些块使用其自身的列式索引)。
您可以在任意列组合上创建索引。要将索引定义为 UNIQUE
或 PRIMARY KEY
索引,它必须包含分区列(通常是时间列)。
选择哪个列来创建索引取决于您存储的数据类型。当您创建超表时,请将 time
列的数据类型设置为 timestamptz
而不是 timestamp
。更多信息请参阅 PostgreSQL 时间戳。
注意
虽然可以添加不包含 time
列的索引,但这会导致摄取速度非常慢。对于时序数据,对时间列进行索引允许每个块创建一个索引。
考虑一个简单示例,从 office
和 garage
两个位置收集的温度数据
一个在 (location, time DESC)
上的索引是这样组织的
garage-0940garage-0930garage-0920garage-0910office-0930office-0920office-0910
一个在 (time DESC, location)
上的索引是这样组织的
0940-garage0930-garage0930-office0920-garage0920-office0910-garage0910-office
关于索引的一个经验法则是分层思考。首先选择您通常希望运行等式运算符的列,例如 location = garage
。然后选择您希望使用范围运算符的列,例如 time > 0930
。
举一个更复杂的例子,假设您有许多设备正在跟踪 1,000 家不同的零售店。每家店有 100 台设备,设备类型有 5 种。所有这些设备都以 float
值报告指标,您决定将所有指标存储在同一张表中,如下所示
CREATE TABLE devices (time timestamptz,device_id int,device_type int,store_id int,value float);
当您创建此表时,将在时间列上自动生成一个索引,从而加快基于时间的查询速度。
如果您想基于时间以外的条件查询数据,可以创建不同的索引。例如,您可能只想查询特定 device_id
的上个月数据。或者您可以查询单个 store_id
在过去三个月的所有数据。
您希望保留时间索引,以便快速筛选给定时间范围的数据,并添加另一个针对 device_id
和 store_id
的索引。这将创建一个复合索引。复合索引 (store_id, device_id, time)
首先按 store_id
排序。然后,每个唯一的 store_id
将按 device_id
顺序排序。具有相同 store_id
和 device_id
的每个条目再按 time
排序。要创建此索引,请使用以下命令
CREATE INDEX ON devices (store_id, device_id, time DESC);
当您的超表上存在此复合索引时,您可以运行各种不同的查询。以下是一些示例
SELECT * FROM devices WHERE store_id = x
此查询针对列表中具有特定 store_id
的部分。此索引对于此查询有效,但可能有些臃肿;仅在 store_id
上建立索引可能会更有效率。
SELECT * FROM devices WHERE store_id = x, time > 10
此查询无效,因为它需要扫描列表的多个部分。这是因为列表中包含某个设备 time > 10
数据的部分将位于与另一个设备不同的部分。在这种情况下,请考虑改为在 (store_id, time)
上建立索引。
SELECT * FROM devices WHERE device_id = M, time > 10
示例中的索引对于此查询是无用的,因为 device M
的数据在每个 store_id
的列表中位于完全不同的部分。
SELECT * FROM devices WHERE store_id = M, device_id = M, time > 10
这是针对此索引的准确查询。它将列表缩小到非常特定的部分。
关键词
此页面有问题?报告问题 或 在 GitHub 中编辑此页面
。