Timescale Cloud:性能、规模、企业级

自托管产品

MST

由于查找数据可能需要很长时间,特别是当您的超表中数据量很大时,您可以使用索引来加快从行存储中未压缩块的读取操作(这些块使用其自身的列式索引)。

您可以在任意列组合上创建索引。要将索引定义为 UNIQUEPRIMARY KEY 索引,它必须包含分区列(通常是时间列)。

选择哪个列来创建索引取决于您存储的数据类型。当您创建超表时,请将 time 列的数据类型设置为 timestamptz 而不是 timestamp。更多信息请参阅 PostgreSQL 时间戳

注意

虽然可以添加不包含 time 列的索引,但这会导致摄取速度非常慢。对于时序数据,对时间列进行索引允许每个块创建一个索引。

考虑一个简单示例,从 officegarage 两个位置收集的温度数据

一个在 (location, time DESC) 上的索引是这样组织的

garage-0940
garage-0930
garage-0920
garage-0910
office-0930
office-0920
office-0910

一个在 (time DESC, location) 上的索引是这样组织的

0940-garage
0930-garage
0930-office
0920-garage
0920-office
0910-garage
0910-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_idstore_id 的索引。这将创建一个复合索引。复合索引 (store_id, device_id, time) 首先按 store_id 排序。然后,每个唯一的 store_id 将按 device_id 顺序排序。具有相同 store_iddevice_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 中编辑此页面