哪个更快:多行还是多列?
Posted
技术标签:
【中文标题】哪个更快:多行还是多列?【英文标题】: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 有一行每个键都有一列?
此外,还假设需要相当定期地添加/删除键,我认为一旦表变得足够大,这将影响多列方法的长期可维护性。
编辑:澄清一下,“定期”是指每月左右添加或删除一次密钥。
【问题讨论】:
【参考方案1】:您不应该定期添加或删除列。
【讨论】:
定期每月一次。基本上,一旦您的应用程序投入生产,您永远不应该更改数据库模式。唯一的例外是您的业务需求发生了根本性的变化。 此答案没有回答问题,即具有更多列或更多行的架构是否会导致更快的查询。另外,这个答案没有任何解释,不反映软件开发的实际情况。我不明白为什么这个答案是“正确”的答案。【参考方案2】:http://en.wikipedia.org/wiki/Entity-Attribute-Value_model
这个模型有很多不好的地方,如果有其他选择,我不会使用它。如果您不知道应用程序所需的大部分数据列(除了少数用户可自定义的字段),那么您需要花更多时间进行设计并弄清楚。
【讨论】:
【参考方案3】:如果您的键是预设的(在设计时已知),那么是的,您应该将每个键放在单独的列中。
如果它们在设计时未知,那么您必须将数据作为键值对列表返回,稍后您应该在 RDBMS
之外对其进行解析。
【讨论】:
【参考方案4】:如果您要存储键/值对,则应该有一个包含两列的表,一列用于键(将此作为表的 PK),另一列用于值(可能根本不需要此索引) .记住,“钥匙,整个钥匙,只有钥匙。”
在多列方法中,您会发现您的表无限制地增长,因为删除列会破坏所有值,您不会想要这样做。我在这里的经验是在一个遗留系统上工作的,该系统有一个包含近 1000 列的表,其中大部分是位字段。最终,您不再能够删除任何列,因为有人可能正在使用它,而您最后一次这样做时,您一直工作到凌晨 2 点才回滚备份。 p>
【讨论】:
【参考方案5】:首先:确定您的数据需要被访问的频率。如果始终需要一次性检索数据并且大部分数据都已使用,则考虑将所有密钥对存储为序列化值或 xml 值。如果您需要对该数据进行任何类型的复杂分析并且您需要值对,那么列是可以的,但将它们限制为您知道需要执行查询的值。设计使用一列作为一个参数的查询通常比设计行更容易。您还会发现使用起来更容易 如果它们都在一行而不是多行,则返回值。
第二:把你最常访问的数据分开放在自己的表里,其他数据放在另一个表里。顺便说一句,100 列很多,所以我建议您将数据拆分成更易于管理的小块。
最后:如果您有可能经常更改的数据,那么您应该使用在一个表中创建列(键),然后使用它的数字键值来存储键值。这假设您将多次使用同一个键,并且应该在您进行查找时加快搜索速度。
【讨论】:
以上是关于哪个更快:多行还是多列?的主要内容,如果未能解决你的问题,请参考以下文章