【发布时间】:2013-11-27 03:19:33
【问题描述】:
我看到的所有地方都解释说我应该在这样的情况下创建一个表索引:
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)
有没有办法提高这个查询的性能?
【问题讨论】:
-
您可以帮我们一个忙,重新格式化代码,这样我们就不必一直滚动。
-
@hgoebl,我正在使用 CODE 标签进行格式化。有更好的选择吗?
-
玩家中有两个ID是有原因的吗?其中之一在插入时是独一无二的吗?
-
因为意思不同。一个是玩家 ID,另一个是联赛 ID。
-
这是误导。重命名为
leagueid不会有什么坏处。并将我的答案标记为不正确;-)
标签: sql sqlite indexing query-performance