在MySQL表中存储重复数据

时间:2011-08-28 17:10:47

标签: mysql optimization

我有一张包含所有已注册members的表格,其中包含uidusernamelast_action_time等列。

我还有一张表,可以跟踪过去5分钟内online的成员。它由cronjob填充,从members提取数据,last_action_time不到5分钟。

问题:我的online表格应该包括username还是否?我问这个是因为我可以JOIN两个表来获取这些数据,但是我可以将username存储在online表中而不必加入。我担心的是,我将把重复的数据存储在两个表中,这似乎是错误的。

5 个答案:

答案 0 :(得分:1)

这种方法称为非规范化。我的意思是有时为了快速选择查询,我们必须跨表复制一些数据。在这种情况下,如果两个表中都有大量数据,我相信这个是很好的选择。

答案 1 :(得分:1)

如果您没有遇到性能问题,请勿进行非规范化。有一句好话“正常化直到它受伤,反正常化直到它起作用”。在您的情况下,它适用于规范化架构(加入用户表)。数据库旨在处理大量数据。

答案 2 :(得分:1)

您刚刚提出了一个非常有效的问题:何时复制数据才有意义?

我可以将您的问题重写为:何时使用缓存是有意义的。缓存需要维护,您需要自己更新它们并且它们占用了一些额外的空间(在这种情况下可以忽略不计)。但他们有一个专业:性能提升。

在您提到的示例中,您需要查看性能提升是否真的值得,以及它是否超过了拥有和维护缓存的额外工作。

我的直觉是你的数据库并不庞大,所以每次加入都需要从服务器上花费很少的精力,所以我会继续使用它。

希望有所帮助

答案 3 :(得分:0)

您不应将用户名存储在在线表格中。不应该有任何性能问题。每次只需使用联接来获取用户名。

另外,您根本不需要联机表,为什么不查询具有last_action_time<的用户?会员表5分钟?

答案 4 :(得分:0)

用户ID是整数(AKA 4字节)。用户名(我想象的最多16个字节)。有多少用户?如何更改用户名?这些是需要考虑的问题。

我只会存储用户名。我想,但是一旦用户名被注册,它就会被修复一段时间。

如果在没有一点背景的情况下很难回答这些问题 - 当深度和呼吸,使用情况等未知时,很难想到性能问题。