日期字段上的 Postgres DESC 索引

Posted

技术标签:

【中文标题】日期字段上的 Postgres DESC 索引【英文标题】:Postgres DESC index on date field 【发布时间】:2015-01-05 15:11:36 【问题描述】:

我在一个大表上有一个日期字段,我主要按 DESC 顺序查询和排序。我在该字段上有一个默认 ASC 顺序的索引。我读到,如果索引位于单个字段上,那么它是 ASC 还是 DESC 顺序并不重要,因为可以从两个方向读取索引。将索引更改为 DESC 会受益吗?

【问题讨论】:

查看执行计划(使用explain analyze)就知道了。 您可能在这里读到:由于可以向前或向后扫描有序索引,因此创建单列 DESC 索引通常没有用 - 排序顺序已经可用常规索引。 postgresql.org/docs/current/static/… 【参考方案1】:

操作系统通常在向前方向读取文件的效率更高,因此您可以通过创建DESC 索引来稍微加快速度。

为了大大加快速度,请在上面创建 DESC 索引和 CLUSTER 表。

CLUSTER tablename USING indexname;

ASC 索引上进行聚类也会带来改进,但会更少。

【讨论】:

我怀疑操作系统的顺序文件处理会以某种方式影响单列索引的速度。毕竟它是作为二进制搜索处理的,无论如何都会进行随机访问。你有关于这个问题的任何文档或资料吗?我会很感兴趣 磁盘驱动器的顺序读取速度更快,任何促进顺序读取的东西都会提高性能。如果表是并且预期的结果集足够大,以至于为查询选择索引扫描,并且查询的读取表的部分主要按顺序执行,这将提高性能。

以上是关于日期字段上的 Postgres DESC 索引的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 文本搜索与 GIN 索引并在其他列上排序 DESC

Postgres:按日期时间优化查询

postgres - 日期时间自动转换

第22期:索引设计(组合索引适用场景)

日期时间字段上的 MySQL 索引不是 RANGE 类型,而是使用 INDEX 类型

将列上的纪元时间保存到另一列 postgres