创建数据库的查询是:
创建表 foo(id TEXT); 在 foo(id) 上创建索引 `foo.index`; 创建表栏(id TEXT); 在 bar(id) 上创建索引 `bar.index`; CREATE VIEW baz AS SELECT id FROM foo UNION ALL SELECT id FROM bar; CREATE TABLE bam(id TEXT, value TEXT); 插入 foo 值('123'); 插入 foo 值('1123'); 插入 foo 值('2123'); 插入 foo 值('3123'); 插入柱值('44123'); 插入柱值('441123'); 插入柱值('442123'); 插入柱值('443123');
结果EXPLAIN QUERY PLAN SELECT * FROM baz LEFT JOIN bam ON baz.id=bam.id WHERE baz.id IN ('123', '234');
是:
扫描表 foo(~1000000 行) 扫描表栏(~1000000 行) 复合子查询 2 和 3(联合所有) 扫描子查询 1(~2000000 行) 执行列表子查询 4 搜索表 bam 使用自动覆盖索引 (id=?) (~7 行)
编辑:有趣的是,如果我这样做EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM baz WHERE baz.id IN ('123', '234')) AS t LEFT JOIN bam ON t.id=bam.id ;
仍然不使用索引,但如果我这样做EXPLAIN QUERY PLAN SELECT * FROM baz WHERE baz.id IN ('123', '234');
了。到底是怎么回事?
为什么不使用 foo 和 bar 上的索引?它确实使用了没有 JOIN 部分的索引,这在链接问题中很明显。
SQL 小提琴:http ://sqlfiddle.com/#!7/32af2/ 14(使用 WebSQL)