【问题标题】:Cannot understand COVERING INDEX query plan for UPDATE query无法理解 UPDATE 查询的 COVERING INDEX 查询计划
【发布时间】:2016-11-07 14:49:47
【问题描述】:

我有一个如下的 SQLite 表:

CREATE TABLE TableA (ColumnA INTEGER PRIMARY KEY AUTOINCREMENT,
                     ColumnB INTEGER NOT NULL,
                     ColumnC TEXT NOT NULL)

我在这个表上创建了两个索引,如下所示:

CREATE INDEX ColumnB_ColumnC_on_TableA ON TableA (ColumnB ASC, ColumnC ASC)
CREATE INDEX ColumnC_on_TableA ON TableA (ColumnC ASC)

当我对以下查询运行 EXPLAIN QUERY 命令时...

UPDATE TableA SET ColumnB = 1 WHERE ColumnC = '1'

...我看到输出如下...

SEARCH TABLE TableA USING COVERING INDEX ColumnC_on_TableA (ColumnC=?)

我不明白为什么查询计划说ColumnC_on_TableA 索引是一个覆盖索引,而该索引并未覆盖表中的所有列。任何人都可以理解并解释它吗?

【问题讨论】:

    标签: sqlite android-sqlite


    【解决方案1】:

    covering index 是一个索引,涵盖了在搜索中实际使用的所有列

    UPDATE 总是读取/写入整个表行(以及相应的索引条目),但是为了查找要更新的行,不需要读取任何表行的内容。

    【讨论】:

    • 感谢 CL 的回复,但我还是不明白。在我的问题示例中,EXPLAIN QUERY PLAN 输出表明使用覆盖索引ColumnC_on_TableA 搜索了TableA。让我困惑的是ColumnC_on_TableA 不是覆盖索引。 (另一个索引是覆盖索引,即ColumnB_ColumnC_on_TableA)我是否错误地阅读/理解了输出?
    • 明白了!现在这是有道理的。举个例子:SELECT * FROM TableA WHERE ColumnC = '1'的查询计划是SEARCH TABLE TableA USING INDEX ColumnC_on_TableA (ColumnC=?)SELECT ColumnC FROM TableA WHERE ColumnC = '1'的查询计划是SEARCH TABLE TableA USING COVERING INDEX ColumnC_on_TableA (ColumnC=?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多