当前位置: 首页 > 科技观察

什么是高基数?

时间:2023-03-20 15:42:11 科技观察

高基数列是指数据基本不重复或全部具有唯一值的列。典型的高基数列是ID、电子邮件地址或用户名。具有高基数的数据表列的一个示例是具有名为USER_ID的列的USERS表。此列包含1-n个唯一值。每次在USERS表中创建新用户时,都会在USER_ID列中创建一个新编号以唯一标识他们。由于USER_ID列中存储的值是唯一的,因此该列的基数类型称为高基数。如果你在工作中使用数据库,尤其是在处理时间序列数据时,那么你可能会面临处理高基数数据的挑战。特别是在工业物联网(例如制造、石油和天然气、公用事业等)和一些监控和事件数据工作负载中,高基数时间序列的处理是一个常见问题。高基数也是开发者经常讨论的话题,围绕它的问题往往很多。在这里澄清一个常见的混淆点:高基数之所以成为时序数据世界的大问题,是因为一些流行的时序数据库的局限性。如果选择了正确的数据库,高基数数据实际上是一个可以解决的问题。让我们回过头来首先定义什么是高基数。什么是高基数?广义上讲,基数指的是一个集合中值的个数。有时集合的基数很小(低基数),有时可能很大(高基数)。例如,上图中有很多(美味的)M&M,但是这个数据集的基数很小(6):在数据库世界中,基数是指特定列或字段中包含的唯一值的数量的一个数据库。然而,对于时间序列数据,事情会变得有点复杂。时间序列数据通常与描述该数据的元数据(有时称为“标签”)配对。通常,对主要时间序列数据或元数据进行索引以提高查询性能,以便可以快速找到匹配所有指定标签的值。时间序列数据集的基数通常定义为每个索引列的基数的叉积。如果有6种颜色的m&ms和5种类型的m&ms(普通、花生、杏仁、椒盐卷饼和脆饼),那么我们的基础现在是6x5=30种m&ms。使用正确的索引,我们可以高效地找到所有蓝色、酥脆的M&M(客观上是最好的)。如果您有多个索引列,每个列都有大量唯一值,则叉积的基数会变得非常大。这就是软件开发人员在谈论具有“高基数”的时间序列数据集时通常所说的“高基数”。让我们看一个例子。高基数示例:工业物联网想象一下采石场中的物联网场景,大型重型设备做三件事:采矿、破碎岩石和分拣岩石。假设10,000台设备,每台设备有100个传感器,运行10个不同的固件版本,分布在100个位置:该数据集的最大基数变为10亿[10,000x100x10x100]。现在,假设该设备也是移动设备,我们希望存储精确的GPS位置(纬度、经度)(纬度、经度)并将其用作查询的索引元数据。因为(lat,long)是一个连续字段(而不是像equipment_id那样的离散字段),通过对位置进行索引,该数据集的最大基数现在是无限的(无界)。为时间序列设计的关系数据库如何处理高基数不同的数据库以不同的方式处理高基数。从根本上说,数据库在处理高基数数据集时的表现如何可以追溯到它最初的设计方式。如果您正在处理大量时间序列数据并使用关系数据库,那么用于索引数据的可靠数据结构是b树。依靠B树数据结构来索引数据对高基数数据集有几个好处:您可以清楚地了解数据库的性能。只要您希望查询的数据集的索引和数据适合内存(可以调整),基数就不是问题。您可以控制索引哪些列,包括在多个列上创建联合索引的能力。如果您的查询工作负载发生变化,您还可以随时添加或删除索引。您可以在离散字段和连续字段上创建索引,尤其是因为B树使用以下运算符比较好:<、<=、=、>=、>、BETWEEN、IN、ISNULL、ISNOTNULL。我们的示例查询(“SELECT*fromsensor_dataWHEREmem_free=0”和“SELECT*fromsensor_dataWHEREtemperature>90”)将以对数或O(logn)时间复杂度运行。虽然时间序列数据库使用其他方法来实现高基数,但事实证明使用b树结构是可靠的。如果遇到高基数相关的数据问题,可以留言一起讨论。参考链接:https://dzone.com/articles/what-is-high-cardinality译者介绍卢新望,社区编辑,半路出家的90后程序员。做过前端页面,写过业务接口,做过爬虫,学过JS,有幸接触到Golang,参与过微服务架构的改造。目前主要编写Java,负责公司可定制低代码平台数据引擎层的设计和开发。