时间序列索引选择
为时间序列工作负载选择合适的索引——复合索引(device_id、ts DESC)可以覆盖常见模式
时间序列索引选择 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
常见的时序查询
“某个实体的近期数据”:
SELECT * FROM metrics
WHERE device_id = 42
AND ts >= NOW() - INTERVAL '24 hours'
ORDER BY ts DESC LIMIT 1000;复合索引(device_id, ts DESC)
时序数据的标准索引:
CREATE INDEX metrics_device_ts_idx
ON metrics (device_id, ts DESC);
-- Equality on device_id, range + sort on ts: index handles both.为什么顺序很重要
- (device_id, ts) — 最适合“这个设备的近期数据”
- (ts, device_id) — 最适合“这个时间点的所有设备”
请根据查询组合进行选择。
仅追加表的 BRIN
BRIN 非常小——对于十亿行的表,只需几 MB。只有当数据在物理存储上按照索引列排序时才有效(时序数据通常符合这一点):
CREATE INDEX metrics_ts_brin ON metrics USING BRIN (ts);
-- Excellent for "give me last 24 hours" on append-only tables.B 树与 BRIN
- B 树 — 根据精确标识符进行毫秒级查询;也适合按近期时间查询
- BRIN — 对单调数据进行快速范围扫描;维护成本低
您可以组合使用:在 (device_id) 上建立 B 树,在 (ts) 上建立 BRIN。
超表索引
TimescaleDB 会将索引传播到所有数据块。请删除未使用的索引——每个数据块都要承担它们的开销。
为热点子集建立部分索引
如果 99% 的查询都访问近期数据:
CREATE INDEX metrics_recent_idx
ON metrics (device_id, ts DESC)
WHERE ts >= NOW() - INTERVAL '7 days';
-- Issue: predicate must use literal date or be re-created periodically.避免在索引列上使用函数
不要对索引列应用函数——这会使索引无法使用:
-- BAD:
WHERE date_trunc('hour', ts) = $1
-- GOOD:
WHERE ts >= $1 AND ts < $1 + INTERVAL '1 hour'最新行查询的索引
对于“每个设备的最新读数”这类查询,正确的索引可以将查询转换为索引范围扫描:
CREATE INDEX metrics_device_ts_idx ON metrics (device_id, ts DESC);
SELECT DISTINCT ON (device_id) device_id, ts, value
FROM metrics
ORDER BY device_id, ts DESC;
-- Uses the index to take the first row per device.按热点顺序进行 CLUSTER
CLUSTER 会按照某个索引对表进行物理重排。这是一次性操作;新数据仍会按照到达顺序追加:
CLUSTER metrics USING metrics_device_ts_idx;
-- Cluster is heavy. TimescaleDB chunks help by keeping recent chunks small.高基数等值查询的哈希索引
时序数据很少使用它,但确实存在。通常对 device_id 使用 B 树就足够了。
不要建立过多索引
时序表通常写入频繁。每个索引都会造成写放大。只添加您实际查询所需的索引。
回顾
时序索引主要就是一小组常用模式。
- 使用复合索引 (entity, ts DESC) 进行按实体查询
- 在 ts 上使用 BRIN 进行仅追加数据的范围查询
- 超表:索引会传播到各个数据块
- 避免在列上使用函数作为谓词
快速检查
您最频繁的时序查询会按 device_id 进行筛选,并读取最近 24 小时的数据。最佳索引是什么?
常见问题解答
「时间序列索引选择」课时是免费的吗?
是的 — 「时间序列索引选择」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「时间序列索引选择」这节课中我会学到什么?
为时间序列工作负载选择合适的索引——复合索引(device_id、ts DESC)可以覆盖常见模式 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「时间序列索引选择」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- TimescaleDB 超表
- 连续聚合
- 压缩与保留策略
- 时间序列索引选择