【问题标题】:Creating index on the table在表上创建索引
【发布时间】: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


【解决方案1】:
CREATE INDEX ix_lst ON leaguescoretype (playerid)

我想应该会有所帮助。

如果您经常额外按 scoretype 搜索(使用相等检查),您可以这样创建它:

CREATE INDEX ix_lst ON leaguescoretype (playerid, scoreid)

看看Foreign key optimization in SQLite

编辑

顺便说一句,我会从桌面玩家的主键中删除 (playerid, id) 之一。外键在形式上(或至少在外观上)不正确,因为它仅引用 PK 列之一。虽然我认为这不会影响性能。

编辑 2 大多数关系数据库不会自动为外键约束创建索引。 在许多情况下,这不是必需的。

以您的餐桌scoretype 为例。我假设此表上唯一的操作是非常罕见的插入。如果您从不主要通过 scoretypeid 搜索您的 leaguescoretype,那么您不需要索引。

但是没有索引,只能通过扫描整个表才能找到表中的行。查看where 条件和表的大小。较大的表受益于索引。 (一般来说,并非在所有情况下都有效。)

【讨论】:

  • 是的,它确实有帮助。谢谢你。现在你能解释一下这样一个索引的原因吗?我不喜欢使用我不理解的东西。 TIA。
  • 谢谢。现在我明白了一点。 ;-)
猜你喜欢
  • 2013-10-24
  • 2013-06-02
  • 2015-08-14
  • 1970-01-01
  • 2011-10-23
  • 2018-01-18
相关资源
最近更新 更多