mysql - 多少列太多了?

Posted

技术标签:

【中文标题】mysql - 多少列太多了?【英文标题】:mysql - how many columns is too many? 【发布时间】:2010-12-01 05:36:27 【问题描述】:

我正在设置一个可能有 70 列以上的表格。我现在正在考虑将其拆分,因为每次访问表时都不需要列中的某些数据。再说一次,如果我这样做,我就不得不使用连接。

在什么时候(如果有的话)被认为列太多了?

【问题讨论】:

我们不必一直使用 SELECT *。我们始终可以选择仅选择特定情况所需的列。 70 列?!其中有多少不能为空? 最大的问题是……您是否正在规范您的表格? 70 是一个不寻常的数量,除非您为了性能而故意非规范化(很少有事物具有 70 个独特属性)。如果您为了性能而进行非规范化,那么我同意 ChssPly76 的观点,即您可以使用数据库可以让您摆脱的任何东西。 @KM。这应该是个玩笑吗?我是 mysql 新手,无法获得它,您的意思是 JOIN 是一件好事还是要尝试避免的事情? 尽管连接是 SQL 的核心部分,但为了连接而连接可能会降低您拥有的任何应用程序的性能和可维护性。 【参考方案1】:

一旦超过maximum limit supported by the database,就被认为太多了。

您不需要每个查询都返回每一列这一事实是完全正常的;这就是为什么 SELECT 语句可以让您明确命名所需的列。

作为一般规则,您的表结构应该反映您的领域模型;如果你确实有 70 个(100 个,你有什么)属于同一个实体的属性,那么没有理由将它们分成多个表。

【讨论】:

@ChssPly76,它是一个关系数据库而不是对象模型。有表,行和列,如果您想要最大性能,则在该约束内工作,为了性能而模拟您的对象以方便。那么关于一个人的每条信息都应该存储在同一行中吗?不,将它们分开并将它们分组到不同的表中(使用我之前评论中的示例):“Person”、“Activity”、“HealthRecords”。出于性能原因存储 SUM 与将所有数据保存在 70 列中以避免连接是完全不同的问题。 “numberOfTeethPulled”应该是人员记录的一部分吗?不,它可能根本不应该存储 - 如果您的域模型需要这样的详细信息,您将从“ToothExtractionRecord”中获取该信息。但那是你的(我敢说,相当做作)的例子——它与我的观点无关:表中的大量列并不意味着表是非规范化的。想想房地产合同/采购订单/其他财务文件,仅举几个例子。它们可以进一步分成多个表吗?是的。有什么理由这样做吗?不是真的。 +1,太搞笑了。如果您正在创建另一个表,并且它只是一个 1:1 的关系,您可能应该将它包含在主表中。它不会节省空间,如果您不请求数据而不是根本不在表中,它的性能不会好得多。我现在想到的唯一合法原因是那里是否有敏感信息,例如 SSN、信用卡信息等...... 如果我有一个表有 15 个列,另一个有 300 个列,那么这两个表的主键是相同的。在两个表中选择一列,性能会不会有很大差异?【参考方案2】:

将表拆分为具有较少列的多个表有一些好处,也称为Vertical Partitioning。以下是一些:

    如果你有很多行的表,修改索引可能需要很长时间,因为 MySQL 需要重建表中的所有索引。将索引拆分到多个表中可以加快速度。

    根据您的查询和列类型,MySQL 可能会将临时表(用于更复杂的选择查询)写入磁盘。这很糟糕,因为磁盘 i/o 可能是一个大瓶颈。如果查询中有二进制数据(文本或 blob),则会发生这种情况。

    Wider table can lead to slower query performance.

不要过早优化,但在某些情况下,您可以从更窄的表中获得改进。

【讨论】:

为什么MySQL只修改了一个索引就需要重建表中的所有索引? 我也想知道。为什么 MySQL 重建表中的所有索引?上述说法正确吗?【参考方案3】:

当它违反规范化规则时它太多了。如果您正在对数据库进行规范化,那么很难获得这么多列。设计您的数据库以对问题进行建模,而不是围绕任何关于针对特定数据库平台进行优化的人为规则或想法。

将以下规则应用于宽表,单个表中的列可能会少得多。

    没有重复的元素或元素组 对串联键没有部分依赖 不依赖非关键属性

这里有一个link 可以帮助您。

【讨论】:

It is pretty hard to get that many columns if you are normalizing your database. 并不像看起来那么难。 绝对没那么难。人们似乎并不真正了解这些部分周围的正常形式。您可以有 10000 列并且仍然被规范化(甚至是最高的范式)。 @foljs 这正是公认的非规范化实践的用武之地。如果你在十字路口,一辆汽车即将驶入你,等待灯亮是愚蠢的变绿。你必须让开。虽然闯红灯在技术上可能不合法,但鉴于这种情况,你正在做你应该做的事情 = 非规范化 当你开始谈论汽车时,你失去了我。不知道相关性是什么。 但是,在这种情况下,您如何使用单个数据表进行复杂的查询,您不能,您必须严重依赖编程语言和各种其他东西才能完成这项工作!所以,我不妨回到拥有 170 列的表,因为在我看来,让单独的表工作所需的“JOIN”查询和额外复杂的编程似乎是在浪费时间。我想我是 KISS 原则的忠实粉丝。【参考方案4】:

这不是问题,除非所有属性都属于同一个实体并且不相互依赖。 为了让生活更轻松,您可以在其中存储一个带有 JSON 数组的文本列。显然,如果您每次都获取所有属性都没有问题。尽管这将完全违背将其存储在 RDBMS 中的目的,并且会使每个数据库事务变得非常复杂。因此,不推荐在整个数据库中遵循这种方法。

【讨论】:

【参考方案5】:

在同一个表中有太多列也会导致复制中的巨大问题。你应该知道master中发生的更改会复制到slave..例如,如果你更新表中的一个字段,整行将是w

【讨论】:

以上是关于mysql - 多少列太多了?的主要内容,如果未能解决你的问题,请参考以下文章

多少数据库索引太多了?

JS中有多少Vars太多了? [关闭]

编舞跳帧!多少算太多?

您网站上的自定义 jQuery 脚本中有多少行代码?多少才算太多?

在 PHP 中,每页有多少个 DB 调用是可以的?

在数据库中创建视图最多可以连接多少个表?连接表多了有啥影响…