【问题标题】:Ideal order for index creation in Postgres在 Postgres 中创建索引的理想顺序
【发布时间】:2021-06-14 19:04:33
【问题描述】:

我有一个名为 timestamppsql 的表。我要在其上创建索引的列名为 timestamp1id13。我要测试一堆查询,但其中大多数看起来像这样:

 select date_trunc('day',timestamp1) as day,avg(id13) from timestamppsql where timestamp1 >='2010-01-01 00:05:00' and timestamp1<='2015-01-01 00:05:00' group by day order by day desc,

类似的东西

select id13 from timestamppsql where timestamp1 >='2010-01-01 00:05:00' and timestamp1<='2011-01-01 00:05:00',  
select avg(id13)::numeric(10,2) from timestamppsql where timestamp1>='2015-01-01 00:05:00' and timestamp1<='2015-01-01 10:30:00'

我将创建一个索引:

create index project_index on timestamppsql(timestamp1,id13);

问题是索引的正确顺序是什么?timestamp1 first 还是 id13? 我知道按顺序排列的第一个索引(从左到右)应该是我们使用较多、重复值最少且列限制最多的索引。您对此有何看法?

【问题讨论】:

  • 如有疑问,请评估两个版本。
  • @jarlh 我同意你的看法!我只是想谈谈以防我错过了什么

标签: sql postgresql indexing


【解决方案1】:

WHERE 子句是创建索引的主要子句。您希望索引首先支持过滤。因此,对于这些查询,您需要在 id13` 之前使用 timestamp1

请注意,通常 Postgres 会访问数据页,即使使用索引也是如此,因此在索引中使用 id13 可能并不重要。 Postgres 在最近的版本中改进了优化,因此在没有修改的表中,可以使用覆盖索引。这就是说timestamp1 作为索引中的第一列非常重要。 id13 没那么重要。

【讨论】:

  • 。谢谢!感谢您的帮助!
  • 。我还有一件事要问你。我正在使用大约一百万行的表。我从不从表中删除或更新某些内容。我只是在开始时导入数据,然后我测试查询。我应该担心统计信息是最新的吗?
  • 不,您需要担心表被清理得足够频繁,以便您获得快速的仅索引扫描。升级到 v13 并调整 autovacuum_vacuum_insert_scale_factor
  • @LaurenzAlbe 。 . .这是否意味着我给出的关于在所有其他数据库中覆盖索引的建议现在可以在 Postgres 中使用?耶!
  • @GordonLinoff 是的,我认为从 PostgreSQL 9.3 开始。需要注意的是,您必须定期 (auto-)VACUUM,以便在 可见性地图 中将大多数块标记为“全部可见”,并且不需要对桌子进行可见性检查对于大多数行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2017-09-04
相关资源
最近更新 更多