在MySQL中使用多个表和/或为Rails应用程序使用多个列

在MySQL中使用多个表和/或为Rails应用程序使用多个列,sql,mysql,ruby-on-rails,database,Sql,Mysql,Ruby On Rails,Database,我想知道在MySQL数据库中使用冗余列的最佳实践是什么。我想知道这一点,因为我的数据库中有一个用户表,但我也希望能够显示关于每个用户的许多统计信息。这些统计数据可能包括用户与另一个模型交互的次数或他们有多少条消息 搜索某个对象(如消息)的所有记录以进行计数是否会影响性能?还是在用户表中创建一个称为total_messages的冗余列更好,该列在每次添加/删除消息时都会更新?谢谢,这让我困惑了一段时间。简单的回答是:两者都做 根据经验,我不喜欢创建和更新可以动态计算的数据(即计数)。因此,在您发现

我想知道在MySQL数据库中使用冗余列的最佳实践是什么。我想知道这一点,因为我的数据库中有一个用户表,但我也希望能够显示关于每个用户的许多统计信息。这些统计数据可能包括用户与另一个模型交互的次数或他们有多少条消息

搜索某个对象(如消息)的所有记录以进行计数是否会影响性能?还是在用户表中创建一个称为total_messages的冗余列更好,该列在每次添加/删除消息时都会更新?谢谢,这让我困惑了一段时间。

简单的回答是:两者都做

根据经验,我不喜欢创建和更新可以动态计算的数据(即计数)。因此,在您发现性能瓶颈并进行相应调整之前,我将推迟添加这些冗余统计信息

您可以随时添加基于用户活动的追溯统计信息,因此您可以通过只添加绝对需要的冗余来“增长”应用程序


添加冗余数据可以提高性能,但它从来都不是一刀切的解决方案,如果您不断尝试计算和更新可以通过简单请求即时计算的使用率值,您可能最终会损害整体性能;您不是添加冗余列,而是添加了一段可优化的SQL代码,它在外部看起来像一个列,但保证与数据保持同步。SQL优化视图的事实使得检索数据非常快。

检查Rails中的计数器缓存。他们是为你做的

差不多

class Messages < ActiveRecord::Base
  belongs_to :user, :counter_cache => true

  # ...
end
class消息true
# ...
结束

这将要求您在users messages表中有一列\u count(并可以避免您使用messages.count)

一般来说,是什么使SQL查询速度变慢?这是SQL语句的复杂性吗?或者正在检索的记录数?即使有大量记录,查找所有记录是否会很快?我认为在某些情况下,查找所有记录会更快,我认为您只需要查看耗时最长的内容,并尝试进行优化。也许存储查询或页面加载时间是一个很好的开始。