0

我有一个关于我的 MySQL 数据库的问题,想了解什么是最有效的。

我的问题如下,

我正在为我的棋盘游戏网站开发高级功能。一项高级功能是用户玩过的所有游戏都将被“永久”存储(供用户以后查找)。对于普通用户,超过 18 个月的游戏将被删除。

现在我需要找到一种有效的方法来删除普通非高级用户的游戏(超过 18 个月)并为高级用户保留游戏。

简化事情我得到了两张桌子(实际上还有一张桌子用于存储每个游戏的游戏参与者):

游戏,

 id=INT
 play_date=DATETIME
 end_score=INT
 player_id_1=INT
 player_id_2=INT

用户,

 id=INT
 premium=BOOLEAN (true=enabled, false=not enabled)

user 表包含 300.000+ 行,而 Games 表包含几百万行。每天大约有 20.000 场比赛被添加到游戏表中。

从非高级用户那里删除超过 18 个月的游戏的最有效方法是什么。

到目前为止,我们已经在每个星期一早上为所有用户删除了 18 个月以上的游戏。

现在我需要考虑溢价和游戏日期。

一些解决方案(?):

  • 加入表格,尽管我们在 Games 表格中谈论数百万行,这将是一个禁忌?
  • 获取超过 18 个月的每个游戏条目,然后从 player_id_1 和 player_id_2 获取每个用户条目,如果其中任何一个是高级的,让游戏成为,否则如果它超过 18 个月,则将其删除。因此,在一周内,这可能是 20k*7=140k 的游戏价值。
  • 上面的解决方案,除了我每小时做一次。然后我需要获取和检查大约 1000 个游戏。
  • ?? 在 Games 表中添加某种辅助变量?但是如果用户停止使用高级版怎么办......

欢迎任何提示...

4

4 回答 4

3

使用过期日期和索引。

在该列上允许 NULL。

高级用户将在他们的游戏中获得 NULL。

删除 expire_date < sysdate 的游戏将使用索引,它是一个 INDEX RANGE SCAN(它必须在可排序索引上,我的意思是,某种 B-tree 内部表示......但我不是 MySQL 专家)。

编辑

或者使用 expire_date 维护一个单独的注册表 PK 表。所以高级用户记录不会占用空间。然后你从 xxx where pk in 中删除(从 expiring_table 中选择 pk)。

但这对以前的解决方案来说并不是一个很好的增强。

年龄

也许您可以使用年龄(例如 1 年龄 = 1 个月)。并在表中设置一个字段“month_to_live”。每个月您都会为所有非空记录更新字段 += 1。这使用相等过滤器。但正如我之前所说,我不是专家,所以我不知道你能从中获得多少优化)。

我应该坚持在 expire_date 字段中(并且您具有将生存期单独延长到任何人的额外能力,而在删除记录时不会产生额外的开销)。

于 2010-01-22T15:17:16.657 回答
1

下载数据库的转储并在​​您的计算机上进行一些基准测试。这应该让您对各种解决方案的执行方式有一个很好的了解

除此之外,这是对那些 sql 查询问题的通常答复:对您的查询运行“解释”并确保您具有正确的索引。

于 2010-01-22T15:16:48.833 回答
0

加入应该不会太糟糕,我猜你不是在做那个查询“活”?另一种选择是在显示游戏时进行查询:如果用户是高级用户,则不限制,否则限制范围。

于 2010-01-22T15:19:04.070 回答
0

您需要避免每次用户更改状态时都更新游戏表的解决方案,因为这是不必要且缓慢的。

这是一个。假设您每天在同一时间运行查询:

DELETE games FROM games
JOIN users u1 ON (u1.id=games.player1_id AND NOT u1.premium)
JOIN users u2 ON (u1.id=games.player2_id AND NOT u2.premium)
WHERE games.play_date BETWEEN DATE_SUB( now(), INTERVAL 18 MONTH 1 DAY 1 HOUR)
AND DATE_SUB( now(), INTERVAL 18 MONTH )

当然你应该有一个关于游戏的索引( play_date )。

这里的想法是日期范围检查仅检查可能需要删除且尚未被昨天的查询检查的游戏。有点像“滚动窗口”。

相反,这:

WHERE games.play_date < DATE_SUB( now(), INTERVAL 18 MONTH )

每次都会检查表中所有现有的游戏,并且会非常慢。

于 2011-06-07T08:51:33.050 回答