【问题标题】:sqlite: unique covering indexsqlite:唯一覆盖索引
【发布时间】: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 强制选择覆盖索引。

这样合理吗?

【问题讨论】:

    标签: sqlite unique-index covering-index


    【解决方案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 上创建索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2016-11-30
        • 2017-11-17
        • 2013-12-19
        • 1970-01-01
        相关资源
        最近更新 更多