假设我有一个包含三列 A、B、C 的表 t1,其中 (A,B) 包含一个唯一键(具有数十万行)。由于 90% 的查询将采用 SELECT C FROM t1 WHERE A=? 和 B =?,我想我想要 A、B 和 C 的覆盖索引。
如何拥有包含 C 并将 (A,B) 定义为唯一的覆盖索引?
我正在考虑拥有两个索引:一个唯一索引和一个覆盖索引,并使用 INDEXED BY 强制选择覆盖索引。
这合理吗?
假设我有一个包含三列 A、B、C 的表 t1,其中 (A,B) 包含一个唯一键(具有数十万行)。由于 90% 的查询将采用 SELECT C FROM t1 WHERE A=? 和 B =?,我想我想要 A、B 和 C 的覆盖索引。
如何拥有包含 C 并将 (A,B) 定义为唯一的覆盖索引?
我正在考虑拥有两个索引:一个唯一索引和一个覆盖索引,并使用 INDEXED BY 强制选择覆盖索引。
这合理吗?
在 SQLite 3.8.2 或更高版本中,您可以将此表设为 WITHOUT ROWID 表,以便表本身的行为类似于覆盖索引:
CREATE TABLE t1 (
A,
B,
C,
PRIMARY KEY (A, B)
) WITHOUT ROWID;
是的,这是合理的。
但是,在您这样做之前,我建议您尝试将主键放在 A 和 B 上,然后再次尝试查询。看看有没有性能提升。如果没有收获,您当然可以尝试使用create unique index idx_t1_ab on t1(a,b)
. 然后在 A、B 和 C 上创建索引。