【发布时间】:2012-03-04 15:17:21
【问题描述】:
抱歉,如果过去已对此进行了全面介绍 - 我看过一些相关的帖子,但没有找到任何让我对此特定情况感到满意的内容。
我最近一直在研究一个相对简单的游戏,大约有 10,000 名玩家。在游戏中,您可以捕捉和繁殖具有特定属性(即翅膀、角、鬃毛)的宠物。数据库中当前有一个如下所示的表:
-------------------------------------------------------------------------------
| pet_id | wings1 | wings1_hex | wings2 | wings2_hex | horns1 | horns1_hex | ...
-------------------------------------------------------------------------------
| 1 | 1 | ffffff | NULL | NULL | 2 | 000000 | ...
| 2 | NULL | NULL | NULL | NULL | NULL | NULL | ...
| 3 | 2 | ff0000 | 1 | ffffff | 3 | 00ff00 | ...
| 4 | NULL | NULL | NULL | NULL | 1 | 0000ff | ...
etc...
表格就这样继续下去,目前有 100 多列,但一般来说,一只宠物只有大约 1-8 个这些属性。每 1-2 个月添加一个新属性,这需要添加表列。该表很少更新和经常阅读。
我一直建议我们转向更垂直的设计方案以获得更好的灵活性,因为我们希望在未来开始添加更多的属性,即:
----------------------------------------------------------------
| pet_id | attribute_id | attribute_color | attribute_position |
----------------------------------------------------------------
| 1 | 1 | ffffff | 1 |
| 1 | 3 | 000000 | 2 |
| 3 | 2 | ffffff | 1 |
| 3 | 1 | ff0000 | 2 |
| 3 | 3 | 00ff00 | 3 |
| 4 | 3 | 0000ff | 1 |
etc...
老开发者担心这会造成性能问题,因为用户会非常频繁地搜索具有特定属性的宠物(即必须具有这些属性,必须至少具有该颜色或位置的一个,必须具有 > 30 个属性)。目前搜索速度很快,因为不需要 JOINS,但引入垂直表可能意味着对每个搜索的属性进行额外的连接,并且行数也会增加三倍左右。
我的问题的第一部分是,是否有人对此有任何建议?我对数据库设计或优化不是特别有经验。
我已经针对各种案例运行了测试,但它们基本上没有定论 - 我运行的所有查询的时间差异很大(即在半秒到 20 多秒之间),所以我认为我的问题的第二部分是是否有比在 PHP 中使用 microtime(true) 更可靠的分析查询时间的方法。
谢谢。
【问题讨论】:
-
您是否在用户搜索的列上创建了适当的索引? 20 多秒对于 10k 玩家来说听起来很长,即使他们每个人都有一百只宠物。
-
在提议的新模式中,不可能定义适当的索引。