sqlite:唯一覆盖索引

sqlite: unique covering index

假设我有一个包含三列 A、B、C 的 table t1,其中 (A,B) 包含一个唯一键(有数十万行)。由于 90% 的查询将采用 SELECT C FROM t1 WHERE A=?和 B =?,我想我想要 A、B 和 C 的覆盖索引。

如何获得包含 C 并将 (A,B) 定义为唯一的覆盖索引?

我正在考虑使用两个索引:一个唯一索引和一个覆盖索引,并使用 INDEXED BY 为 SELECTS 强制覆盖索引。

这样合理吗?

是的,这是合理的。

但是,在您执行此操作之前,我建议您尝试在 A 和 B 上放置一个主键,然后再次尝试您的查询。看看是否有性能提升。如果没有收获,您当然可以尝试使用 create unique index idx_t1_ab on t1(a,b) 来强制执行唯一性。然后在A、B、C上创建索引。

在 SQLite 3.8.2 或更高版本中,您可以将此 table 设为 WITHOUT ROWID table,以便 table 本身的行为类似于覆盖索引:

CREATE TABLE t1 (
    A,
    B,
    C,
    PRIMARY KEY (A, B)
) WITHOUT ROWID;