数据库中高基数的危险信号

导航至

高基数描述的是具有不同值的数据库。例如,如果每个行项目都有唯一的 ID 号、描述、电子邮件地址等。具有许多重复值的列将被描述为具有低基数。并非每个人都以相同的方式计算基数,因此在实施之前分析您的方法非常重要。

让我们面对现实:基数不是一个容易理解的概念。我们在万维网上看到许多不同的定义是有原因的——就像在公共场合突然唱歌一样,上下文很重要。不是每个人都想参与音乐剧,也不是每个人都以相同的方式计算基数。无论理解起来多么困难,我们中的一些人仍然必须处理和围绕基数工作,特别是如果像我一样,你在数据库领域工作。让我们理清基数的基础知识。

什么是基数?

在最基本的层面上,基数是数据库中唯一数据集的数量。例如,我有两条狗——Bear 和 Freddie——在任何给定的时间,它们都在做三件事之一:睡觉、吠叫或咀嚼。

High cardinality in databases - InfluxDB

在图 1 中,我们有一个狗及其相关状态的列表。在这种情况下,我的宠物数据中有六种独特的组合:2 条狗,每条狗都与 3 种状态相关联。此数据集的基数为 6(2 条狗 x 3 种状态)。

当我们把数据放入数据库时,我们在数据的不同方面之间建立关系。当基数为 6 时,我的狗和它们的活动具有非常直接的关系。让我们添加更多上下文。它看起来像这样

High cardinality in databases

我们仍然有两条狗和三种可能的状态,但我们有 5 个房间在房子里。

2 条狗 x 3 种状态 x 5 个地点 = 30

这是对基数的高估,因为每条狗并非与每种状态都相关联,而且更精确的数学计算有点(很多?)更复杂,但这对于我们的小例子来说是一个接近的估计。

用最直接的方式来说,就数据库而言,基数的意义实际上归结为两件事。数据基数是与查询性能最相关的。如前所述,这是对列中存在多少唯一值的检查。

更重要的是,我们可以看到添加更多唯一属性如何增加唯一组合的总数。如果我今天去收容所再领养一条狗,基数将跃升至 45(3 条狗 x 3 种状态 x 5 个地点)。

High cardinality in databases

未列出的状态:嬉戏

现在想象一下,我们跟踪的不是狗,而是世界各地成千上万颗卫星,每颗卫星都发回状态、位置、传感器数据和时间戳。我们很容易达到数百万甚至数十亿的基数。

这方面的另一个例子是一家信用卡公司,它有两个表。第一个表显示拥有信用卡的人,第二个表单独显示卡。如果一个人只能拥有一张信用卡,那么这显然是一个标准的一对一关系。如果允许该人注册多张卡,那么这将是一对多关系,因为他们将连接到另一个表上的许多不同条目。

我需要担心基数吗?

大多数时候,我们不必自己计算基数——这是一件好事!如果您喜欢那种数学(它被称为集合论!),有很多文章介绍如何计算基数,这些计算已内置于数据库的工作方式中。我们不需要花时间计算基数,但我们确实需要注意我们在数据之间建立的关系,因为最终,基数会影响我们数据库的性能和稳定性。

我们的数据越复杂,从数据库中写入、存储和检索它的成本就越高。有两个简单的步骤可以找出基数是否是您数据库中的问题

  1. 了解您的数据库认为什么是高基数。访问社区论坛和文档!
  2. 使用数据库的工具找出数据的基数(这是一个关于如何在 InfluxDB 中查找基数的示例)

一个集合的基数是多少?

最广泛使用和接受的数据基数定义涉及一个集合中有多少值。在更大的数据库上下文中,这指的是表列中唯一值的总数,与同一表中的行数相比。请注意,就本次讨论而言,重复值不是您需要关心的内容。

同样重要的是要理解,基数数据库状态永远不会真正用数字表示——它不像您在 1 到 10 的范围内查看值那样。为了尽可能简单明了,人们只是谈论“低”或“高”基数。低基数指的是一个数据库,它有很多重复的值,如状态标志、布尔值或性别。相比之下,高基数指的是一个数据库,它有大量的不同值,如 ID 号、用户名或电子邮件地址。

了解所有这些很重要,因为基数最终会影响数据库的查询执行计划。根据是否存在高基数或低基数,可以使用不同的计划来尝试解锁最佳性能。

如何找到一个集合的基数

尽管基数这个话题很复杂,但值得庆幸的是,如何找到基数的过程真的再简单不过了。这也是您可以对您正在处理的任何有限元素集重复的过程。

您只需要做的就是计算集合中值的总数,并将其标识为您的主要基数。然后,您可以使用数据基数和其他过程来进一步定义集合中这些值之间的关系——但这在很大程度上是另一回事。

请注意,集合中出现的值的顺序不会以任何方式影响基数。它们可以按字面上的任何顺序排列,并且根本不会影响集合的基数。同样,重要的是要理解,两个不同的集合可能具有相同的基数,但这并不意味着它们是相等的。如果它们之间没有相同的存在值,它们可以具有相同数量的值,但仍然是不同的。这一切都很大程度上取决于所讨论的数据库和您当前正在处理的信息。

如果我遇到高基数该怎么办?

值得一提的是,即使您有高基数,您也可能不需要做任何事情。拥有高基数数据并不是一件坏事,了解我们的数据很复杂可以帮助我们找到专门与此相关的问题。如果您的数据库中存在性能或稳定性问题,那么值得尝试降低基数来解决这些问题。

您可以回答的第一个问题是:您是否需要存储的每个唯一值?例如,您或许可以每分钟而不是每 5 秒插入数据,而不会丢失数据中的模式。另一种选择是在指定的时间窗口后使数据过期,以保持数据集更小。

如果这两种方法都不是选择,并且您的数据始终是复杂的,请确保您使用的是专为高基数数据设计的数据库。

总结

我们一直在泛泛地谈论基数,但还有一个因素需要考虑:数据在数据库中的组织方式会影响基数。问题在于,数据组织方式随数据库而变化,这使得很难涵盖它可以提供帮助的所有方式。

希望这个解释足以让您开始学习基数。是的,它很复杂,但并非不可知。我们不必成为数据库架构师就能理解这个概念或它为什么重要。基数是一种衡量数据复杂性的方法,以便我们更好地理解数据不同方面之间的关系。这有助于我们建立更智能的关系并设计更稳定的系统。去互联网上阅读更多关于基数的内容吧!