【问题标题】:What is the best way to create index and unique constraint?创建索引和唯一约束的最佳方法是什么?
【发布时间】:2022-01-01 03:48:55
【问题描述】:

在如下架构上创建索引和唯一约束的最佳方法是什么?

我的大部分查询将基于date 列进行过滤。如果我在 date 上创建单列索引和一个包含(日期和键)的唯一约束,我最终会创建两个索引,因为唯一约束也会创建一个索引。

有没有更好的方法解决这个问题?

date key value
12-12-2021 a 3
12-12-2021 b 4
12-13-2021 a 3
12-13-2021 b 4

【问题讨论】:

  • 通过在 (date,key) 上创建主键将为您提供索引以及强制执行的唯一性。仅使用日期字段过滤器的查询很可能会使用范围扫描,因为它位于索引的前沿(first_column)

标签: sql postgresql indexing database-design


【解决方案1】:

视情况而定。

我的大部分查询将根据日期列进行过滤。

这还不够信息。对于平等过滤器,(date, key) 上的PRIMARY KEYdate 作为前导列!)通常就可以了:

CREATE TABLE tbl (
  date  date
, key   text
, value int
, PRIMARY KEY (date, key)
);

因为……见:

这也涵盖了date 上的范围 过滤器,但与key 上的相等过滤器结合使用时效果并不理想,因为...请参阅:

如果您的表格与您的示例所建议的一样简单,并且您通常在 SELECT 列表中包含 value,请考虑使用 覆盖索引(需要 Postgres 11 或更高版本)以获得仅索引扫描:

...
, PRIMARY KEY (date, key) INCLUDE (value)

见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多