【问题标题】:MySQL: duplicating data vs. joinMySQL:复制数据与加入
【发布时间】:2010-10-24 23:24:02
【问题描述】:

假设我有两个表:source 和 article,并且我希望阅读包含其来源的具体细节的文章,我可以 (1)对两个表使用join;要么 (2) 将详细信息复制到文章记录中(这会使数据单元变大,但查询会很简单)。 哪个效率更高?

【问题讨论】:

    标签: mysql performance join


    【解决方案1】:

    如果优先考虑读取性能,您可以使用Materialized Views。由于 MySQL 不支持它们(我认为),你可以simulate them

    此解决方案可让您保持原始数据库的规范化,但您可以通过来自 MV 的简单查询获得性能。

    【讨论】:

      【解决方案2】:

      复制数据可能会带来更高的性能。请注意,我写了可能是因为您将遇到缓存问题。另一方面,在复制数据时,您会使系统更难维护(顺便说一句,您违反了 DB 范式)。如果您必须支付的价格只是一个表连接,那么只需支付它。确保在要加入的列上有 indexex,这样价格就不会那么贵了。

      底线:除非很重要,否则切勿重复数据。

      【讨论】:

        【解决方案3】:

        这是一个设计决策,这意味着无需您分析的所有细节(目标、约束、用户需求等),而是使用一些经验法则;

        1/ 2 个表之间的连接通常不是很昂贵,并且很容易调整(例如,您说更新很少,我认为插入/删除不是很广泛,并且主要是选择,因此这很可能是索引会加速的情况)

        2/ 在设计模式时,首先将其规范化到可能/合理的最高程度,然后当现实世界的场景证明它值得时,去规范化。 (通常决定对特定项目进行规范化然后去规范化效果很好,不规范化通常不会产生好的结果。

        3/ 在一段时间内,标准化是有回报的(在以后的几年中,当您尝试对系统进行一些更改时,设计良好的基础确实受到欢迎和赞扬)

        4/ 在我看来,非规范化最适合报告将使用即席查询的情况。或者换句话说,我认为非规范化的主要原因是让具有高查询写入/使用比率的报告编写者的生活更轻松

        【讨论】:

          【解决方案4】:

          哪个效率更高?

          简单地说(也许太简单了):您正在用内存换取 CPU 周期 - 这可能会导致更差的缓存能力并降低性能。

          正确回答您的问题的唯一方法是利用您的环境并衡量性能。确保包含“正确”的索引表。为数据库创建一个实际的负载 - 例如确保您不会一遍又一遍地访问相同行的缓存。

          先问问自己是否值得从什么性能增益(1%、10%、100%)开始非规范化。

          【讨论】:

            【解决方案5】:

            取决于数据。假设您有巨大的文章表和小型作者表。如果您想做很多查询来获取一些文章数据和作者姓名(默认情况下在文章表中),那么您将对每个“作者”行进行简单的主键查找,并且表可能适合内存,因此在文章表中包含作者姓名不会有巨大的性能提升。另外,这个denormalization 也会让“articles”表变大一些(每个作者的名字都会重复很多次),所以它会占用更多的缓存。

            另一方面,如果您想查询每个作者的文章数量,从两个表中获取这些数据意味着每次都要聚合很多行。但是,如果您将这个数字包含在“作者”表中,那么获得它意味着只需一次查找,并且每添加一篇文章就会增加一个增量。因此,如果您对这种结果感兴趣,非规范化可能是有意义的。

            【讨论】:

              【解决方案6】:

              视情况而定,您是否希望数据库中有重复数据?然后,当您需要更新某些内容时,您必须在多个位置进行更新。有时有一些重复数据是可以的,但避免将所有数据连接在一起可能会对您产生负面影响。

              【讨论】:

              • 为了争论,快速阅读是我的首要任务,所以我愿意冒险进行更困难的写入操作。 (更不用说我的大部分数据一旦写入就不会改变)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-17
              • 2023-03-05
              • 1970-01-01
              • 2015-09-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多