MySQL空列

5

我最近在进行优化。

通常我会使用多个表格,这样我就不会有空列。

我的问题是,空列是否很重要?我不是指空间。我是指索引速度、数据检索等方面的速度。

我的例子是当我有一个简单的客户表时,某些列并没有总是填满。比如电子邮件、出生日期、社会安全号码或照片。我想说,大多数情况下它们都没有填写。

这导致我创建一个新的表来存储辅助数据。但如果我把这些列和其他客户信息放在同一个表中,真的会有什么区别吗?

如果我这样做,那么就会有许多带有空列的记录。这让我想知道当记录数量庞大时,这会对性能产生多大影响。

3个回答

2
如果您将它们存储为可变长度字段(例如:VARCHAR),则空列不会占用太多(或者根本不占用)空间。这是以比仅具有固定长度字段的表慢得多的查找速度为代价的。
我个人认为即使有许多空列(也称为空表),也没关系。一些数据库甚至针对稀疏表进行了优化。如果您开始有许多额外的表,那么逻辑就变得更加复杂,这使得维护引用完整性变得更加困难。
在您的customers表中,您可以使用一个额外的customer_profiles表,与customers表具有1:1的关系。将基本信息存储在customers中,将其余信息(即:您不需要每次查找客户时都需要的内容)存储在customer_profiles表中。

2

如果你一直在进行优化,我的建议是停止它 :-)

优化应该是针对性能问题而不是一时兴起的行为。如果没有性能问题,所有的优化都是徒劳。

在正确设计的模式下,空字段很少对数据检索产生大的影响,因为大多数查询应尽可能仅使用索引来决定要获取哪些行。一旦发现了这些行,就需要去表中获取实际数据。

并且索引速度不会因为列存储在另一个表中而改变。如果需要索引,则需要进行索引。

我更喜欢我的模式尽可能简单(同时仍然基本遵循3NF),以避免不必要的连接。


1

使用外部表来托管辅助数据是其中一种选项,就像可为空的列一样。

它可以节省一些空间,但需要更多资源来连接表格。

如果您的模型是一个稀疏矩阵(有很多属性,其中大部分不会被定义),那么存储和扫描这些属性的成本甚至可能超过了 JOIN 的成本。

然而,使用额外的表格,您将无法创建一个索引,该索引将涵盖来自不同表格的两个属性。

关系模型通常允许使用多种方法来实现一个 ER 模型,这正是它所说明的。

您可能想要阅读这篇文章:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接