为什么SQLite没有意识到这是覆盖索引?

时间:2017-12-07 16:42:27

标签: sqlite

我有一个看起来像这样的SQLite数据库:

template <class T>
class my2darray {
    std::vector<T> values;
    size_t m, n;
   public:
     my2darray(size_t m, size_t n) : values(m*n), m(m), n(n) {}
     T& operator()(size_t i, size_t j) {
          return values[i*n+j];
      }
};

部分索引是专门为这样的查询创建的:

CREATE TABLE image
(
    capture_time,
    capture_number,

    part_located,

    other_data,
    some_more_data,

    PRIMARY KEY (capture_time, capture_number)
) WITHOUT ROWID;

CREATE INDEX image_ix_no_part
    ON image (capture_time, capture_number)
    WHERE NOT part_located;

不幸的是,SELECT capture_time, capture_number FROM image WHERE NOT part_located ORDER BY capture_time, capture_number; 没有提及覆盖索引的任何内容,即使这个部分索引包含所有必要的信息。这不应该起作用吗?

1 个答案:

答案 0 :(得分:1)

这是我最终使用的解决方法:

CREATE INDEX image_ix_no_part
    ON image (
        capture_time, capture_number,
        part_located -- Needed for a covering index search.
    )
    WHERE NOT part_located;

它不必要地在每个索引条目的末尾添加一个零,但它只需要一个字节,因此它是可接受的损失。