postgresql - postgresql中多列上的多个索引与单个索引

标签 postgresql database-indexes

阅读有关该主题的一些现有帖子,我无法得出任何结论性的答案。

我有过去 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/

相关文章:

MySQL:使用 IN(...) 索引强制不同的 access_type

sql - 使用 postgreSQL 的 ORDER BY COUNT 优化(索引?)

sql - Postgres XML 数据类型

mysql - 在 C# 应用程序的 MySQL 数据库中的非常大的表中,简单的选择查询需要更多的时间

sql - view中Where子句前的select语句处理

mysql - 是否不需要创建额外的索引?

Mysql 值索引!= 0

sql - 从 Rails 模式文件中删除 SQL 代码

sql - 计算与组内最小值的差值

sql - Count distinct where 属性是任一键