阅读有关该主题的一些现有帖子,我无法得出任何结论性的答案。
我有过去 10 年在 100 个地点的某些数据。该表有大约 8 亿行。我需要主要为每个位置生成年度统计数据。有时我还需要生成每月变化统计数据和每小时变化统计数据。我想知道我是否应该生成两个索引 - 一个用于位置,另一个用于年份,或者为位置和年份生成一个索引。我的主键目前是一个序列号(可能我可以使用位置和时间戳作为主键)。
谢谢。
最佳答案
无论您在关系上创建了多少个索引,在某个查询中只会使用其中一个(哪个取决于查询、统计信息等)。因此,在您的情况下,您不会从创建两个单列索引中获得累积优势。为了从索引中获得最大性能,我建议在(位置、时间戳)上使用复合索引。
请注意,像 ... WHERE timestamp BETWEEN smth AND smth
这样的查询将不会使用上面的索引,而像 ... WHERE location = 'smth'
或... WHERE location = 'smth' AND timestamp BETWEEN AND smth
将。这是因为索引中的第一个属性对于搜索和排序至关重要。
不要忘记执行
ANALYZE;
创建索引以收集统计信息后。
更新:
正如评论中提到的 @MondKin 某些查询实际上可以在同一关系上使用多个索引。例如,使用 OR
子句查询,如 a = 123 OR b = 456
(假设两列都有索引)。在这种情况下,postgres 将对两个索引执行位图索引扫描,构建结果位图的并集并将其用于位图堆扫描。在某些情况下,相同的方案可用于 AND
查询,但不是联合,而是交集。
关于postgresql - postgresql中多列上的多个索引与单个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39297221/