为性能选择索引和主键

时间:2013-02-19 15:12:34

标签: sql database performance postgresql database-design

我是数据库设计的新手,我在为战斗游戏设计PostgreSQL数据库时遇到了很多麻烦。

在这个游戏中,玩家将在他们之间进行战斗,获得购买更好武器和装甲的资源。将记录战斗以供将来审查,预计战斗数量将迅速增加,例如,1k战斗1k轮的玩家将产生50万条记录。

游戏互动性降低,用于升级战斗机装备和装备。战斗由机器解决。

详细说明:

  • 每种战斗机只能拥有一种特定类型的武器或装甲。
  • 战斗机几乎全部按id搜索。
  • 我经常需要搜索特定战斗机拥有的装备(武器和/或装甲),但我不希望搜索哪些战士拥有特定类型的武器。
  • 战斗经常会被winnerloser搜索到。
  • 两个给定的fighters可以在不同日期多次竞争,因此元组winner - loser在表combats上不是唯一的
  • fighters表包含很多列,这些列通常会同时被检索到(我在战斗开始的任何时候创建两个“战斗机”类对象及所有相关信息)

这是我目前的设计:

CREATE TABLE IF NOT EXISTS weapons (
    id serial PRIMARY KEY,
    *** Game stuff ***
);

CREATE TABLE IF NOT EXISTS armors (
    id serial PRIMARY KEY,
    *** Game stuff ***
);

CREATE TABLE IF NOT EXISTS fighters (
    id serial PRIMARY KEY,
    preferred_weapon INT references weapons(id),
    preferred_armor INT references armors(id),
    *** Game stuff ***
);

CREATE TABLE IF NOT EXISTS combats (
    id serial PRIMARY KEY,
    winner INT references fighters(id),
    loser  INT references fighters(id),
    *** Game stuff ***
);

CREATE TABLE IF NOT EXISTS fighters_weapons (
    fighter INT NOT NULL references fighters(id),
    weapon INT NOT NULL references weapons(id),
    PRIMARY KEY(fighter, weapon)
);

CREATE TABLE IF NOT EXISTS fighters_armors (
    fighter INT NOT NULL references fighters(id),
    armor INT NOT NULL references armors(id),
    PRIMARY KEY(fighter, armor)
);

我的问题是:

  1. 你觉得我的设计很合适吗?
  2. 我看到很多包含id列的示例数据库作为每个表的主键。有什么理由吗?我应该这样做,而不是我在fighters_weaponsfighters_armors上使用的多列主键?
  3. PostgreSQL为每个主键自动创建索引,但有几个表我不希望通过它进行搜索(即combats)。我应该删除性能索引吗? PostgreSQL抱怨现有的约束。
  4. 我将按fighters_weapons搜索fighters_armorsfighter,以及combatswinner搜索loser,您认为我是应该为这些表上的所有列创建索引吗?
  5. 任何绩效改进建议?最常用的操作是:插入和查询战斗机,查询给定战斗机的装备并插入战斗。
  6. 非常感谢:)

1 个答案:

答案 0 :(得分:0)

解决您的明确问题:

2)最好使用“自然”值作为主键,即如果存在则不使用序列ID。如果您不太可能使用序列ID作为标识符,我会说最好不要添加它。

3)除非你打算很快地将很多行插入到战斗表中,否则在id列上输入索引可能不会太麻烦。

4)如果索引{战斗机,武器}存在,则无需在{战斗机}上创建索引,并且如果索引{战斗机,护甲}存在,则类似地在{战斗机}上创建索引是不必要的。通常,您不会受益于创建作为另一个多列索引的前缀的索引。另外,根据您描述的访问模式,在战斗中创建{winner}和{loser}索引似乎是一个好主意。

5)除了表设计之外,如果您自己安装了数据库,则可能需要设置一些数据库调整参数。如果有经验的数据库管理员已经设置了数据库,他/她可能已经为您完成了此操作。