我有以下数据库:
sqlite> create table t (num number, text text);
sqlite> create index idx on t (num, text);
现在执行:
sqlite> explain query plan select text from t where num=1 order by text;
我期望输出 - 所有这些都是使用覆盖索引完成的。
0|0|0|SEARCH TABLE t USING COVERING INDEX idx (num=?)
现在运行:
sqlite> explain query plan select text from t where num in (1,2) order by text;
输出:
0|0|0|SEARCH TABLE t USING COVERING INDEX idx (num=?)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|USE TEMP B-TREE FOR ORDER BY
为什么静态值列表导致使用" TEMP B-TREE FOR ORDER BY"?
答案 0 :(得分:0)
查询可以从表中读取多行(实际上,从覆盖索引中读取)。
如果以升序索引顺序读取这些行,则text
值已经保证正确排序。
通过遍历IN子句中的每个值并查找索引中的匹配行来实现此查询。 这确实恰好是正确的顺序。
但是,SQLite的查询优化器无法证明IN子句的顺序与索引的num
顺序相同。因此,它不能省略额外的排序步骤。