1

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

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

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

这合理吗?

4

2 回答 2

2

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

CREATE TABLE t1 (
    A,
    B,
    C,
    PRIMARY KEY (A, B)
) WITHOUT ROWID;
于 2015-11-05T08:37:10.820 回答
1

是的,这是合理的。

但是,在您这样做之前,我建议您尝试将主键放在 A 和 B 上,然后再次尝试查询。看看有没有性能提升。如果没有收获,您当然可以尝试使用create unique index idx_t1_ab on t1(a,b). 然后在 A、B 和 C 上创建索引。

于 2015-11-05T05:22:49.793 回答