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

let*_*ght 13 postgresql database-indexes

我无法找到关于这个主题的一些现有帖子的任何结论性答案.

过去10年我在100个地点都有一些数据.该表有大约8亿行.我需要主要为每个位置生成年度统计数据.有时我需要生成每月变化统计数据和每小时变化统计数据.我想知道我是否应该生成两个索引 - 一个用于位置,另一个用于年份或在位置和年份生成一个索引.我的主键当前是序列号(可能我可以使用位置和时间戳作为主键).

谢谢.

Ild*_*sin 15

无论您在关系上创建了多少个索引,在某个查询中只会使用其中一个索引(哪一个取决于查询,统计信息等).因此,在您的情况下,您将无法通过创建两个单列索引获得累积优势.为了从索引获得最大性能,我建议在(位置,时间戳)上使用复合索引.

请注意,像查询... WHERE timestamp BETWEEN smth AND smth不会使用上面,而查询,如索引... WHERE location = 'smth'... WHERE location = 'smth' AND timestamp BETWEEN smth AND smth意愿.这是因为索引中的第一个属性对于搜索和排序至关重要.

别忘了表演

ANALYZE;
Run Code Online (Sandbox Code Playgroud)

创建索引后,以收集统计信息.

  • 大约“在某个查询中只会使用其中的一个”,实际上Postgres确实具有使用多个索引来满足单个查询的能力。请查看手册中的这一章:https://www.postgresql.org/docs/current/indexes-bitmap-scans.html特别是“幸运的是,PostgreSQL能够合并多个索引” (7认同)

Mon*_*Kin 5

对于这种情况,没有经验法则,建议您在生产数据库的副本中进行实验,以查看哪种最适合您:单个多列索引或2个单列索引。

Postgres的一个不错的功能是您可以拥有多个索引,并在同一查询中使用它们。检查文档的这一章

... PostgreSQL具有组合多个索引的能力...以处理无法通过单个索引扫描实现的情况....

...有时多列索引是最好的,但有时最好创建单独的索引并依靠索引组合功能...

您甚至可以尝试创建单个索引和组合索引,并检查每个索引的大小并确定是否值得同时拥有它们。

您还可以尝试一些操作:

  • 如果您的表太大,请考虑对其进行分区。看来您可以按位置或日期进行分区。分区会将表的数据拆分为较小的表,从而减少了查询需要查找的位置。
  • 如果您的数据是按照日期(例如交易日期)排列的,请检查BRIN索引
  • 如果多个查询将以类似的方式处理您的数据(例如汇总同一时期内的所有交易,请检查实例化视图,这样您只需要进行一次这些昂贵的汇总即可。

关于放置多列索引的顺序,首先在要进行相等运算的列上放置,然后在要进行范围>=<=运算的列上放置。