【问题标题】:Which is faster: Many rows or many columns?哪个更快:多行还是多列?
【发布时间】:2010-11-15 03:38:33
【问题描述】:

在 MySQL 中,返回 100 行 3 列还是 1 行 100 列通常更快/更高效/可扩展?

换句话说,当存储与记录相关的许多 key => value 对时,最好将每个 key => value 对存储在以 record_id 作为 key 的单独行中,还是每个 record_id 有一行每个键都有一列?

此外,还假设需要相当定期地添加/删除键,我认为一旦表变得足够大,这将影响多列方法的长期可维护性。

编辑:澄清一下,“定期”是指每月左右添加或删除一次密钥。

【问题讨论】:

    标签: mysql database scalability


    【解决方案1】:

    您不应该定期添加或删除列。

    【讨论】:

    • 定期每月一次。基本上,一旦您的应用程序投入生产,您永远不应该更改数据库模式。唯一的例外是您的业务需求发生了根本性的变化。
    • 此答案没有回答问题,即具有更多列或更多行的架构是否会导致更快的查询。另外,这个答案没有任何解释,不反映软件开发的实际情况。我不明白为什么这个答案是“正确”的答案。
    【解决方案2】:

    http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

    这个模型有很多不好的地方,如果有其他选择,我不会使用它。如果您不知道应用程序所需的大部分数据列(除了少数用户可自定义的字段),那么您需要花更多时间进行设计并弄清楚。

    【讨论】:

      【解决方案3】:

      如果您的键是预设的(在设计时已知),那么是的,您应该将每个键放在单独的列中。

      如果它们在设计时未知,那么您必须将数据作为键值对列表返回,稍后您应该在 RDBMS 之外对其进行解析。

      【讨论】:

        【解决方案4】:

        如果您要存储键/值对,则应该有一个包含两列的表,一列用于键(将此作为表的 PK),另一列用于值(可能根本不需要此索引) .记住,“钥匙,整个钥匙,只有钥匙。”

        在多列方法中,您会发现您的表无限制地增长,因为删除列会破坏所有值,您不会想要这样做。我在这里的经验是在一个遗留系统上工作的,该系统有一个包含近 1000 列的表,其中大部分是位字段。最终,您不再能够删除任何列,因为有人可能正在使用它,而您最后一次这样做时,您一直工作到凌晨 2 点才回滚备份。 p>

        【讨论】:

          【解决方案5】:

          首先:确定您的数据需要被访问的频率。如果始终需要一次性检索数据并且大部分数据都已使用,则考虑将所有密钥对存储为序列化值或 xml 值。如果您需要对该数据进行任何类型的复杂分析并且您需要值对,那么列是可以的,但将它们限制为您知道需要执行查询的值。设计使用一列作为一个参数的查询通常比设计行更容易。您还会发现使用起来更容易 如果它们都在一行而不是多行,则返回值。

          第二:把你最常访问的数据分开放在自己的表里,其他数据放在另一个表里。顺便说一句,100 列很多,所以我建议您将数据拆分成更易于管理的小块。

          最后:如果您有可能经常更改的数据,那么您应该使用在一个表中创建列(键),然后使用它的数字键值来存储键值。这假设您将多次使用同一个键,并且应该在您进行查找时加快搜索速度。

          【讨论】:

            猜你喜欢
            • 2022-01-02
            • 2011-11-08
            • 1970-01-01
            • 1970-01-01
            • 2015-08-22
            • 2014-05-16
            • 2011-03-26
            • 2012-06-12
            • 2010-09-29
            相关资源
            最近更新 更多