sqlite:唯一覆盖索引

Posted

技术标签:

【中文标题】sqlite:唯一覆盖索引【英文标题】:sqlite: unique covering index 【发布时间】:2015-11-05 05:15:29 【问题描述】:

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

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

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

这样合理吗?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

是的,这是合理的。

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

【讨论】:

以上是关于sqlite:唯一覆盖索引的主要内容,如果未能解决你的问题,请参考以下文章

回表与覆盖索引,索引下推

名词解释与区分聚集索引非聚集索引主键索引唯一索引普通索引前缀索引单列索引组合索引全文索引覆盖索引

名词解释与区分聚集索引非聚集索引主键索引唯一索引普通索引前缀索引单列索引组合索引全文索引覆盖索引

0001.索引

mysql索引 回表 覆盖索引 索引下推

MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序