どこを見ても、次のような状況ではテーブル インデックスを作成する必要があると説明されています。
SELECT * FROM foo, bar WHERE foo.field1 < <some_value>;
しかし、私の状況は異なります。
私はSQLiteを使用しており、次のスキーマを持っています:
CREATE TABLE leagues(
id integer primary key,
...
);
CREATE TABLE players(
playerid integer,
id integer,
type integer,
value double,
PRIMARY KEY(playerid,id)
);
CREATE TABLE scoretype(
scoreid integer primary key,
scorename varchar(50)
);
CREATE TABLE leaguescoretype(
playerid integer,
id integer,
scoreid integer,
value double,
foreign key(playerid) references players(playerid),
foreign key(id) references leagues(id),
foreign key(scoreid) references scoretype(scoreid)
);
そして、次のクエリを実行したい:
SELECT
players.playerid,
scoretype.scorename,
leaguescoretype.value
FROM players,scoretype,leaguescoretype
WHERE scoretype.scoreid = leaguescoretype.scoreid
AND players.playerid = leaguescoretype.playerid
AND players.playerid = 1 AND players.id = 1;
EXPLAIN QUERY PLAN の下でこのクエリを実行しようとすると、次のようになります。
SCAN TABLE leaguescoretype (~1000000 rows)
SEARCH TABLE players USING COVERING INDEX sqlite_autoindex_players(id=? AND playerid=?) (~1 rows)
SEARCH TABLE scoretype USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
このクエリのパフォーマンスを向上させる方法はありますか?