问题描述
我们有一个包含以下列的表格:
时间戳 | id | 价值 | ... |
---|
其中 id 代表测量值。例如:特定位置的室温
目前我们有 2 个索引 (id,timestamp DESC)
和默认的 (timestamp DESC)
我们基本上有两种类型的查询:
SELECT * FROM table WHERE id = 'aaa' AND timestamp BETWEEN <date1> AND <date2>
SELECT * FROM table WHERE id in ('aaa','bbb','ccc',...) AND timestamp BETWEEN <date1> AND <date2>
似乎索引 1 对查询 1 非常有用。
对于查询 2,id 的数量可以达到近 200。在这种情况下,是否可以在 (timestamp DESC,id)
上添加索引?
解决方法
对于第一个查询,(id,timestamp DESC)
上的现有索引应该比 (timestamp DESC,id)
更好,因为第一个查询应该先在 id
上选择,然后在 timestamp
.如果只有几行满足 timestamp
上的查询条件,即 timestamp BETWEEN <date1> AND <date2>
,则相反的索引可能会更好。
我强烈建议对您的查询运行 EXPLAIN ANALYZE
并了解如何在查询计划中使用现有索引。
如果您将索引保留在 (id,timestamp DESC)
,那么将默认索引保留在 (timestamp DESC)
上可能是个好主意。
Timescale 写了一个 blogpost about using composite indexes,您可能需要检查一下。