4

我对使用 MySQL 还很陌生,我试图了解在我的数据库中存储玩家库存物品的最有效方法是什么。

所以这里是设置:

有一个名为'player'的表,每个玩家都被分配了一个唯一的 'playerid',它被设置为表的主索引。

每个玩家的库存中最多可以有 24 件物品,这些物品的信息存储在一个名为'player_inventory'的表中。此表具有以下字段:

playerid、slotid、uid、堆栈、用途、耐用性

'uid'是项目的 id,而'stack''uses''durability'只是每个项目需要的值(例如,不同插槽中的相同类型的项目可能具有较低的 'durability')。

问题是,我无法在库存表中的“playerid”上设置索引,因为每个玩家最多有 24 个插槽条目,并且其他字段都不能保证是唯一的。

所以我担心当这个表有 10000 个玩家的库存时,当我去查询它时,这个表中可能有 240,000 个没有索引的条目 - 有什么告诉我这可能非常慢?

我对如何优化我的数据库知之甚少,非常欢迎任何建议。

4

3 回答 3

3

索引——包括主键的唯一索引——可以在多个列上定义。

ALTER TABLE player_inventory ADD PRIMARY KEY (playerid, slotid);

这意味着这两列中的值组合必须是唯一的。但是给定的 playerid 可能出现在多行上,给定的 slotid 可能出现在多行上。

于 2011-09-12T05:04:40.487 回答
1

拥有 3 张桌子可能是个好主意。

  1. tblPlayer(idPlayer INT PK NOT NULL AUTO_INCREMENT、用户名、密码等...)
  2. tblItemInventory(idItemInventory INT PK NOT NULL AUTO_INCREMENT, idPlayer FK, idItem FK, ..)
  3. tblItem (idItem INT PK NOT NULL AUTO_INCREMENT, Durability, Uses, )

tblItem 最多有 24 个(idItem=24)

于 2012-07-05T09:23:12.740 回答
0

为像库存这样的表设置索引有两种思路。一个涉及提出代理键,基本上是表的自动递增索引,与您的应用程序数据无关。它只是用作索引。

强制索引的另一种方法是使用 playerid 和 uid 的组合。虽然如果一个玩家可以拥有多个相同物品的堆叠(例如在暗黑或 MMO 中),您可能可以使用 playerid 和 slotid 的组合作为索引。在 MySQL 中,您可以拥有一个由多个键组成的复合键。

于 2011-09-12T05:03:47.853 回答