SQLite で 2 つのテーブルとビューを作成する次のコードを次に示します。
CREATE TABLE foo(id TEXT); CREATE INDEX `foo.index` ON foo(id); CREATE TABLE bar(id TEXT); CREATE INDEX `bar.index` ON bar(id); CREATE VIEW baz AS SELECT id FROM foo UNION SELECT id FROM bar; INSERT INTO foo VALUES('123'); INSERT INTO foo VALUES('1123'); INSERT INTO foo VALUES('2123'); INSERT INTO foo VALUES('3123'); INSERT INTO バー VALUES('44123'); INSERT INTO バー VALUES('441123'); INSERT INTO バー VALUES('442123'); INSERT INTO バー VALUES('443123');
の結果EXPLAIN QUERY PLAN SELECT * FROM baz WHERE id='123';
は次のとおりです。
SCAN TABLE foo (~1000000 行) SCAN TABLE バー (~1000000 行) TEMP B-TREE (UNION) を使用したサブクエリ 2 と 3 の複合 SCAN サブクエリ 1 (~200000 行)
SQL フィドル: http://sqlfiddle.com/#!7/b5e79/1 (WebSQL を使用)
ご覧のとおり、完全に使用可能なインデックスがある場合、テーブル スキャンを実行しています。なんで?これを修正してインデックスを使用するにはどうすればよいですか?