数据库中高基数值的警示标志

导航至

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

面对事实:基数并不是一个容易理解的概念。我们在互联网上看到对它的定义各不相同,原因就在于,就像在公共场合突然唱歌一样,环境很重要。并不是每个人都想成为音乐剧的一员,也不是每个人计算基数的方式都相同。尽管理解起来很困难,但我们中的一些人仍然需要处理和围绕基数进行工作,尤其是如果你像我一样,在数据库领域工作。让我们解开基数的基本概念。

什么是基数?

在最基本的意义上,基数是数据库中唯一数据集的数量。例如,我有两只狗——熊和弗雷迪——在任何给定时间,它们都会做三件事之一:睡觉、吠叫或咬东西。

High cardinality in databases - InfluxDB

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

当我们把数据放入数据库时,我们会在数据的不同方面创建关系。基数为6时,我的狗及其活动之间的关系相当直接。让我们添加一些更多的背景。它可能看起来像这样

High cardinality in databases

我们仍然有两只狗和三种可能的状态,但家里有五个房间。

2只狗×3种状态×5个地点=30

这只是一个对基数的过度估计,因为每只狗并不与每种状态相关联,而且为了更精确的数学计算稍微(很多?)复杂一些,但对我们这个小的例子来说,这是一个接近的估计。

用尽可能直白的语言来说,基数在数据库中的意义实际上归结为两点。数据基数是与查询性能最相关的一个,正如所述,这是检查列中存在多少唯一值的考察。

更重要的是,我们可以看到添加更多唯一属性如何增加独特组合的总数。如果我今天从收容所领养了另一只狗,基数将增加到45(3只狗×3种状态×5个地点)。

High cardinality in databases

未列出的状态:嬉戏

现在想象一下,如果我们追踪的是成千上万的遍布全球的卫星,每个卫星都会发送状态、位置、传感器数据和时间戳。我们很容易达到数百万甚至数十亿的基数。

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

我需要担心基数吗?

大多数时候,我们不需要自己计算基数——这很好!如果你对这类数学感兴趣(称为集合论!),有很多关于如何计算基数的文章,这些计算是数据库工作原理的一部分。我们不需要花时间计算基数,但我们确实需要意识到我们建立的数据之间的关系,因为最终,基数可能会影响我们数据库的性能和稳定性。

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

  1. 了解你数据库中什么是高基数。去社区论坛和文档看看!
  2. 使用你数据库的工具来找出你的数据基数(这里有一个示例,说明如何在InfluxDB中找到基数)

集合的基数是什么?

最广泛使用和接受的数据基数定义涉及一个集合中有多少个值。在数据库的更广泛背景下,这指的是与表中行数相比,表列中独特值的总数。请注意,在本讨论的目的上,重复的值不是需要关注的对象。

同样重要的是要理解,基数数据库的状态从未真正用数字表达——你不会像看1到10的刻度值或类似的东西一样。为了尽可能简单明了,人们只是谈论“低”或“高”基数。低基数指的是具有许多重复值(如状态标志、布尔值或性别)的数据库。相比之下,高基数指的是具有大量独特值(如ID号、用户名或电子邮件地址)的数据库。

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

如何找到集合的基数

尽管基数的话题很复杂,但幸运的是,如何找到基数的过程实际上非常简单。这也是你可以对任何有限的元素集合重复的过程。

你所需做的就是计算集合中的总值数量,并将其作为你的首要基数。然后,你可以使用数据基数和其他过程来进一步定义集合中这些值之间的关系——但这完全是另一回事。

请注意,集合中值出现的顺序不会以任何方式影响基数。它们可以按任何顺序排列,这不会影响集合的基数。同样,重要的是要理解,两个不同的集合可能具有相同的基数,但这并不意味着它们相等。它们可以具有相同数量的值,但如果它们之间没有相同的值,则仍然是不同的。这主要取决于相关的数据库以及你目前正在处理的信息。

如果我有高基数怎么办?

即使你有高基数,你可能不需要做任何事情。具有高基数数据并不是坏事,知道我们的数据是复杂的可以帮助我们找到与这相关的特定问题。如果你在数据库中遇到性能或稳定性问题,那么尝试降低基数以解决问题是值得的。

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

如果这些选项都不适用,并且你的数据总是复杂的,请确保你使用的是专为高基数数据设计的数据库。

总结

我们一直在讨论基数,但还有一个因素需要考虑:数据库中数据组织的方式会影响基数。问题是数据组织的这种方式会根据数据库而变化,这使得很难涵盖所有可能帮助的方式。

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