如果表中的列太多,是否会降低性能?

Ric*_*nop 28 mysql database schema database-design

除了数据总量的增加之外,表中是否有大量列的性能成本?如果是这样,将表分成几个较小的表可以帮助解决这个问题吗?

tho*_*ter 17

如果你真的需要所有这些列(也就是说,它不仅仅是你有一个设计不佳的表的标志),那么一定要保留它们.

只要你,这不是性能问题

  • 在需要用于选择行的列上使用适当的索引
  • 不要检索SELECT操作中不需要的列

如果您有30列甚至200列,那么数据库就没问题了.如果你想一次检索所有这些列,你只是让它更难工作.

但是有很多列是一个糟糕的代码气味; 我想不出任何合理的理由,设计良好的表会有这么多列,而你可能需要与其他更简单的表格建立一对多的关系.

  • @snowflake:这就是这些事情发生的原因,但是代码异味仍然存在,应该检查数据/架构是否存在潜在的重构. (3认同)
  • 我不明白什么是“难闻的气味”或“设计不佳”意味着主观意见......请解释 (2认同)

HLG*_*GEM 16

即使你已经选择了一个答案,我也会对此进行权衡.是的表太宽可能会导致性能问题(以及数据问题),应该分成具有一对一关系的表.这是由于数据库如何存储数据(在SQL Server以及至少不知道MySQL,但它是值得做的关于datbase如何存储和访问数据读点书在矿井文档).

三十列可能太宽而且可能没有,这取决于列的宽度.如果将30列将占用的总字节数相加,是否宽于可以存储在记录中的最大字节数?

一些列的人,你需要经常比别人少(换句话说,是有需要的,经常使用的信息,并可能出现在只有一个地方没有其他地方其他的东西之间的自然分割),然后再考虑拆分表.

如果您的某些列是phone1,phone2,phone3之类的内容 - 那么您需要多少列并不需要具有一对多关系的相关表.

一般来说,虽然30列并不是非常大,但可能还行.


小智 16

我不同意所有这些帖子说30列气味像坏代码.如果您从未使用过具有30多个合法属性的实体的系统,那么您可能没有太多经验.

HLGEM提供的答案实际上是最好的一个.我特别喜欢他的问题"是否有自然分裂......经常使用与不经常使用"是一个非常好的问题要问自己,你可能能够以自然的方式打破桌面(如果事情得到解决的话)失控).

我的评论是,如果您的表现目前可以接受,除非您需要,否则不要重新发明解决方案.


tda*_*ers 7

从技术上讲,30列绝对没问题.但是,具有许多列的表通常表示您的数据库未正确规范化,即它可能包含冗余和/或不一致的数据.


Vin*_*uck 5

应该没问题,除非你select * from yourHugeTable到处都是。始终只选择您需要的列。


dat*_*.io 5

30 对我来说似乎不算多。除了必要的索引和正确的 SELECT 查询之外,对于宽表,2 个基本技巧也很适用:

  1. 将您的列定义得尽可能小
  2. 当每个表有大量列时,尽可能避免使用动态列,如 VARCHAR 或 TEXT。尝试使用固定长度的列,例如 CHAR。这是为了性能而权衡磁盘存储。

例如,对于 'person' 表中的列 'name', 'gender', 'age', 'bio' 有多达 100 甚至更多的列,为了最大限度地提高性能,最好将它们定义为:

  1. 名称 -字符 (70)
  2. 性别 - TINYINT(1)
  3. 年龄 - TINYINT(2)
  4. 生物文本

这个想法是在合理可能的情况下定义尽可能固定长度的列。动态列应该在表结构的末尾,所以固定长度的列都在它们之前。

不言而喻,这会因大量行而浪费大量磁盘存储,但如果您想要性能,我想这就是成本。

另一个提示是,随着您的进行,您会发现比其他列更频繁使用(选择或更新)的列,您应该它们分开到另一个表中,以形成与包含不常用列的另一个表的一对一关系,并且执行涉及较少列的查询。