【问题标题】:MySQL / Rails Performance: One table, many rows vs. many tables, less rows?MySQL / Rails 性能:一张表,多行 vs. 多表,少行?
【发布时间】:2009-04-28 09:23:24
【问题描述】:
在我的 Rails 应用程序中,我有几个处理资产(附件、图片、徽标等)的模型。我正在使用 attachment_fu,到目前为止,我有 3 个不同的表用于将信息存储在我的 MySQL 数据库中。
我想知道如果我使用 STI 并将所有信息仅放在 1 个表中,使用类型列并具有不同的继承类,是否会对性能产生影响。它会更 DRY 并且更容易维护,因为它们都有许多共同的属性和特征。
但是什么更快呢?多张表,每张表的行数少,还是一张表多行?还是根本没有区别?我必须每秒处理大量信息和查询。
感谢您的意见!
【问题讨论】:
标签:
mysql
ruby-on-rails
performance
single-table-inheritance
【解决方案1】:
多表少行可能更快。
不过,这不是您应该这样做的原因:您的数据库应该为您的问题域建模。一张表是许多实体类型的糟糕模型。因此,您最终会编写大量代码来查找代表您当前关注的实体类型的表的子集。
常规的、可接受的、干净的数据库和前端客户端代码将无法正常工作,因为您的一表就是所有事物,而根本没有事物。
它更慢、更脆弱,会使你的代码在你的应用中成倍增加,并且模型很差。
仅在所有事物都具有完全相同的属性并且在您的问题域中具有相同(或可能是 Liskov 可替代的)语义含义时才这样做。
否则,不要尝试这样做。
或者,如果您这样做,请询问为什么这比使用一个大的 Map/哈希表/关联数组来保存您的应用程序中的所有实体(以及许多功能,其中大多数是复制的、剪切和粘贴的,以及日期,做switch case 或 RTTI 来找出每个实体的真实类型)。
【解决方案2】:
确定的唯一方法是尝试这两种方法并衡量性能。
一般而言,这取决于您是否在这些表之间进行连接,如果是,则取决于这些表的索引方式。一般来说,数据库连接很昂贵,这就是为什么有时会非规范化数据库模式以提高性能的原因。在您处理大量数据(即数百万条记录)之前,通常不会发生这种情况。你可能还没有这个问题,也许永远不会。
【解决方案3】:
如果行具有相同的属性,那么,是的,一个表是非常好的,只有一行来指定数据类型,否则,使用不同的表来处理,在性能,代码量甚至是可读性上更好代码也一样。