【运维 Pro】时序场景实践与原理 - 2. 宽表,窄表与 JSON 字段

2023-09-21 16:20:32

【运维Pro】: 由 YMatrix 售前和售后团队负责的栏目。除了介绍日常的数据库运维和使用知识,我们更希望能够通过介绍这些知识背后的原理,让大家和我们一起感知数据库的美妙。

摘要

在上一期 《时序场景实践与原理 - 1.分布与分区》中,我们围绕时间戳和设备标识列,介绍了设计关于分区、分布的设计思路和原理;在本期内容中,我们会围绕指标列的设计,比较时序场景中常用的宽表、窄表模式,用以灵活扩展的 JSON 和 YMatrix 特有的 mxkv 字段,对它们的使用场景和优缺点进行深入比较和分析。

作者:

王任远 - YMatrix MXUI 研发工程师

01 直观高效的宽表

我们还是使用简单的字段传感器的例子:

根据上面的例子,我们自然而然会直接创建这样的表:

一个指标一列,有几个指标就有几列,就是宽表。

宽表是最直观的设计,所见即所得,非常容易理解;当我们查询时,使用的 SQL 也是简单直观的。

在一个真实的系统中,可能设备标识列是几列数据组成,指标也会多于一个,但基础的逻辑总是相同的。无论对于数据本身的存储还是上层应用的接入,宽表都是既简单又高效。

02 当业务发生变化?

生产环境中,业务会发生变化,时序场景中最常见的业务变更就是追加字段。如果我们为业务追加了新的指标 - 湿度(humidity),就需要在表中增加新的字段。

然而,对于数据库来说,修改表结构是一件严肃的事。

1. 增加列的操作会使用排他锁 (Access Exclusive), 锁住整个表,导致操作时其他关于这个表的业务查询都会被阻塞,是需要审慎对待的。

2. 而在时序场景中,数据量巨大,甚至以 TB 计,在这时,增加列的操作可能会是分钟级甚至数十分钟,耗时难以预测。

添加列的开销:

如果添加列时不设置默认值,那么仅会修改表的元数据,不涉及数据的改变, 所以执行速度是毫秒级。

如果添加列时设置了默认值,那么已有的每一行数据均需重写,后果是当数据量大时,执行时间会长的难以接受。

3. 除此之外,增加一列也有可能使不够强壮的上层应用受到影响:例如应用中可能不严谨的使用 SELECT * FROM table这样的语句,在增加列后,返回值就会多了一列,如果缺少安全的处理,就会导致程序意外终止或者得到预期外的结果。如果我们能够对业务有 100%准确的预测,提前为未来要增加的列预留好字段,比如我已经知道了未来会增加“湿度”,只需要在项目开始时,就将这一列创建出来,问题就能得到解决。

然而,由于实际生产环境中,业务不断发展,最终一个业务有几个指标,每个指标都是什么名字,分别对应什么类型,是难以预测的,所以我们总是无法做到 100%的未雨绸缪。

03 灵活不太好用的窄表

如果不能改表,那么有没有办法在一个表中存储所有的数据呢?如果我们每种必要的数据类型都创建一列,然后额外增添一个指标名列,那么多个指标就可以对应为多行数据,那么就做到了用有限的列记录所有的指标。

如上表所示,无论有多少个不同指标,都能存储在有限的列中。与其使用灵活的优点相比,其缺点同样突出:

1. 随着指标增多,表的行数会显著多于宽表的实现。

2. 当数据量大时,由于每一行包含多个空字段,会导致额外的存储开销。

3. 当需要针对多个指标进行过滤和计算时,需要复杂的 JOIN,导致相应 SQL 的开发和维护成本都明显变高。

04让宽表变得灵活

我们还有另一种选择:在创建宽表时,为后续的修改留足空间。

我们创建了 4 个冗余列,这样未来增加新的列时,只需要把对应的列改名即可。比如我们把 int_1 列征召为新的湿度列。

此外,我们也可以选择不更换列名,相应的我们需要额外的用另一张表存储指标名和列名的映射关系。

YMatrix 中,一张表最多可以支持 1600列。

这样的表有什么缺陷呢?

对于典型的列式存储,比如 AOCO 存储,可以理解为每一个列对一个文件。如果我们真的预留了 1600 列,只用了其中 100 列,那么插入一条数据时,即便其中仅有 100 列有数据,也可能会需要操作 1600 个文件,其写入性能可想而知。因此,这种方式虽然方便,但是具体创建表时需要留下多少列,也是需要根据实际情况权衡的。

除此之外,由于列名的变更,也可能造成对上层应用产生额外的风险。

而如果我们选择不更换列名,则查询时需要和指标映射表进行 JOIN, 会增加额外的复杂度。

05 平衡性能与灵活性的 JSON 字段

针对宽表,我们还有另一个解决方案:在固定字段之外,追加一个额外的 JSON 列。

1. 我们将高频查询的指标单独设置为列,

2. 追加 JSON 列,用以存储所有低频查询的指标。

不足:

1. 查询 JSON 列中的数据时性能逊于独立的列。

2. 查询 JSON 列中的数据时,需要使用一些高级的语法。

-- 查询湿度(humidity)
SELECT extra::json->'humidity' FROM demo;

好处:

1. 独立的列会被独立存储和处理,可以提供更佳的性能,且使用直观方便。

2. JSON 列则负责提供足够的灵活性,可以随意往里面增加新指标,无需考虑类型,字段数量。

3. 虽然 JSON 列的查询涉及一些稍微复杂的语法,但其直观性,复杂度,都远远好于窄表。

06 更高性能的 mxkv 字段

JSON 列提供了良好的灵活性,然而其性能并不尽如人意。当我们同时要求很高的灵活性和性能时, YMatrix 企业版专有的 mxkv 类型字段就是非常合适的选择。

mxkv 是一种单层的 JSON,读写时语法与 JSON 相同,但 mxkv 要求限定 JSON 中值字段的类型。

如上一张示例中的 extra 字段,我们可以指定其类型为 mxkv_int4,这样 extra 就可以用以灵活的存储多个 int4 类型的指标。

CREATE TABLE data(
    time timestamp with time zone,
    device_id text,
    temperature float,
    extra mxkv_int4 -- 新增 extra 字段
)
DISTRIBUTED BY (device_id);

除此之外,还需要通过函数 mxkv_import_keys 预先指定 extra 中的字段名(humidity),才可以向其中写入。

mxadmin=# SELECT mxkv_import_keys('demo'::regclass, '{"humidity": 75}');
 mxkv_import_keys
------------------
 humidity

mxkv 类型虽然使用相对复杂,但是其性能相较 JSON 字段仍然有着明显的优势。在一些字段数量较多,查询复杂的时序场景中,仍然有着独特的优势。目前 YMatrix 研发团队仍在对 mxkv 类型进行持续优化,在未来版本中,我们会进一步提升其使用便利性和性能。

关于 mxkv 更详细的介绍,可以参阅官方文档 《可扩展数据类型:mxkv》:
https://ymatrix.cn/doc/5.1/datamodel/mxkv

Reference:
1. 时序数据模型是什么:
https://ymatrix.cn/doc/5.1/datamodel/what_is_time-Series_datamodel
2. 时序建模思路:
https://ymatrix.cn/doc/5.1/datamodel/guidebook
3. YMatrix 数据建模视频教程:
https://www.bilibili.com/video/BV133411r7WH

本文为 YMatrix 原创内容,未经允许不得转载。

欲了解更多超融合时序数据库相关信息,请访问 “YMatrix 超融合数据库” 官方网站

更多推荐

【车载开发系列】AutoSar软件组件接口

【车载开发系列】AutoSar软件组件接口【车载开发系列】AutoSar软件组件接口【车载开发系列】AutoSar软件组件接口一.端口概念二.三种端口方向三.五种端口属性1)S/RPort2)C/SPort3)ModeSwitchinterface4)其他Port四.PortInterface五.PortInterfa

SSRF绕过思路

SSRFSSRF(Server-SideRequestForgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)形成的原因:SSRF形成的原因大都是由

Google高性能开源框架gRPC:快速搭建及HTTP/2抓包

一、什么是gRPCgRPC是google发起的一个*远程过程调用(rpc)*开源框架,可以在任何语言中,用任何编程语言编写。gRPC基于HTTP/2协议,使用ProtocolBuffers作为序列化工具。gRPC官网:https://grpc.io/RPCRemoteProcedureCall,远程过程调用协议,一种通

AI----人工智能简介

【原文链接】AI----人工智能简介一、人工智能简介1.1人工智能发展的要素数据算法计算力1.2CPU和GPU的区别CPU主要适合I/O密集型的任务GPU主要适合计算密集型任务1.3人工智能、机器学习、深度学习的联系机器学习是人工智能的实现途径深度学习是机器学习的一个方法1.4人工智能发展阶段1.5人工智能主要分支计算

需求管理-架构真题(三十四)

产品配置是指一个产品在其生命周期各个阶段所产生的各种形式(机器可读或人工可读)和各种版本的()的集合。(2021)需求规格说明、设计说明、测试报告需求规格说明、设计说明、计算机程序设计说明、用户手册、计算机程序文档、计算机程序、部件及数据答案:D解析:产品配置主要就是文档、计算机程序、部件及数据的集合。需求管理的主要活

Matlab程序结构

目录顺序结构循环结构1、for循环结构分支结构1、if...end结构2、if...else...end结构3、switch...case...end结构顺序结构顺序结构是最简单的程序结构。用户在编写玩程序后,系统就将按照程序的实际位置逐一顺次执行。例1:求a、b两个数组的和>>a=[123];>>b=[456];>>

【OpenSSL】单向散列函数

什么是单向散列函数任意长度数据生成固定长度是散列快速计算消息变化散列变化单向不可逆,抗碰撞应用场景文件完整性口令加密消息认证伪随机数配合非对称加密做数字签名比特币工作量证明单向hash抗碰撞弱抗碰撞给定X和hash值的情况下,找到另外个数,hash值相同。强抗碰撞找到散列值相同的两个字符串MD5,SHA-1已经被攻破可

竞赛 基于深度学习的人脸表情识别

文章目录0前言1技术介绍1.1技术概括1.2目前表情识别实现技术2实现效果3深度学习表情识别实现过程3.1网络架构3.2数据3.3实现流程3.4部分实现代码4最后0前言🔥优质竞赛项目系列,今天要分享的是基于深度学习的人脸表情识别该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🧿更多资料,项目分享:https:/

Learn Prompt-Prompt 高级技巧:API-Bank & AgentBench

模型评估是Agent学习过程中至关重要的一环。通过分析数据来评估Agent的能力,可以客观地衡量它在特定任务或领域中的表现。数据评估是不断迭代和改进的基础。通过反复评估和分析数据,Agent可以逐步改进自身,并不断优化其能力。数据评估还可以将Agent与其他Agent或标准进行比较,从而了解其在同一任务或领域中的相对能

Learn Prompt-GPT-4:综述

简介"GPT-4,这是OpenAI在扩大深度学习方面的最新里程碑。GPT-4是一个大型的多模态模型(接受图像和文本输入,发出文本输出),虽然在许多现实世界的场景中能力不如人类,但在各种专业和学术基准上表现出人类水平的性能。"--OpenAIGPT-4,顾名思义是GPT-3和GPT-3.5的下一代模型。相比前面的模型,G

汽车行业新闻稿怎么写?怎么写关于汽车的新闻稿?

撰写汽车行业新闻稿需要遵循一定的结构和要点,以确保内容准确、清晰,并能吸引读者的兴趣。以下是关于汽车的新闻稿的一些写作要点和建议,接下来伯乐网络传媒就来给大家分享一下:标题醒目:新闻稿的标题应该简洁明了,能够吸引读者的眼球并概括新闻的要点。可以使用一些字眼来突显重点,例如“首次亮相”、“全新发布”等。新闻价值:新闻稿应

热文推荐