点击上方蓝字每天学习数据库
在MemSQL使用中,我们发现人们对时序数据库的场景非常感兴趣。当遇到以下情况时尤其如此:(1)高效率的事务获取,(2)低延迟查询和(3)高并发查询率。
在下文中,我将展示如何使用MemSQL用作一个强大的时序数据库,并通过简单的查询和用户定义的函数来说明这一点,这些函数将展示如何进行时间序列 - 频率转换,平滑等操作。
我还将介绍如何快速加载时序数据点,并且没有规模限制。
用SQL操作时间序列
与大多数时序数据库不同,MemSQL支持标准SQL,包括内部和外部联接,子查询,通用表表达式(CTE),视图,用于日期和时间操作的丰富标量函数,分组,聚合和窗口函数。我们支持所有常见的SQL数据类型,包括具有微秒精度的datetime(6)类型,该类型非常适合作为时间序列的时间戳。
在金融交易系统中,一种常见的时间序列分析方法是操作股票价格。下面是一个使用标准SQL进行这种计算的简单示例。我们使用一个包含多个股票时间序列的表格,并为每个股票生成高,低,开盘和收盘:

此查询使用标准SQL 窗口函数为表中的每个符号生成高,低,打开和关闭值,假设“ticks”包含最近交易日的数据。

类似的查询可用于创建“烛台图表”,这是一种流行的金融时间序列报表样式,如下图所示,可显示连续时间间隔内证券的开盘价,最高价,最低价和收盘价:

例如,该查询生成一个表,该表可以在三分钟的时间间隔内直接转换为烛台图表:

结果:

平滑是时间序列管理的另一个常见需求。这个查询为股票“ABC”生成一个平滑的价格序列,平均最后三个记录的价格:
结果:

使用可扩展性来增加MemSQL的时间序列功能
MemSQL支持用户定义的标量函数(UDF),聚合函数和存储过程(MPSQL语言)的可扩展性。MemSQL将UDF和存储过程编译为机器代码,以获得高性能。实际上,我使用了可扩展性来创建上一节中用作UDF 的time_bucket()函数(如下面的附录所示); 这为其他特定时间序列产品中的类似功能提供了相同的功能。您可以很容易地创建一个函数或表达式来按时间间隔存储,例如秒、分钟、小时或天。时间序列数据的一个常见需求是执行插值。
例如,假设有一个时间序列,其中随机间隔的点平均间隔为30秒。可能有几分钟没有数据点。因此,如果您将原始(不规则)时间序列数据转换为具有一分钟点的常规时间序列,则可能存在间隙。如果要为没有间隙的绘图提供输出,则需要从间隙前后的值中插入间隙的值。在MemSQL中实现存储过程非常简单,方法是获取一个查询结果,并输出一个行集,其中的空格插入到一个临时表中。
然后可以使用ECHO命令将其发送回客户端应用程序。此外,MemSQL支持用户定义的聚合函数,这些函数可用于实现有用的时间序列操作,例如获取序列中第一个和最后一个值的简写,而无需特定的窗口函数。根据一个名为FIRST()的用户定义的聚合函数(UDAF),考虑此查询以在每三分钟的交易中获得股票ABC的第一个值:

结果:

FIRST()和类似的LAST() UDAF的实现在下面的补充材料部分中给出。
时间序列压缩和生命周期管理
MemSQL擅长处理时间序列事件的突发插入流量和节省空间很重要的历史时间序列信息。对于突发插入流量,您可以使用MemSQL行存储表来保存时间序列事件。对于较大和较长生命周期的时间序列事件集或已经老化的较老的时间序列数据集(因此不再更新它们),MemSQLcolumnstore是一种很好的格式,因为它可以非常有效地压缩时间序列数据。此外,它保存在磁盘上,因此主内存大小不限制您可以存储的数据量。
可扩展的时间序列摄取
构建时间序列应用程序时,数据可以有许多来源,包括应用程序,文件系统,S3,HDFS,Azure Blob商店和Kafka队列。MemSQL可以从所有这些来源快速地获取数据。MemSQL Pipelines专门用于快速轻松地从这些源加载数据流,无需过程编码即可在MemSQL中建立快速的事件流。MemSQL可以以惊人的数据速率提取数据。在最近的一次测试中,我使用了一个双节点MemSQL集群,每个节点在Intel Xeon Platinum 28核系统上运行,每秒直接从应用程序插入2,850,500个事件,具有完整的事务完整性和持久性。可以使用直接加载或Kafka管道获得更好的速率。如果你必须扩展更高,只需添加更多节点 - 没有实际限制。
当通用MemSQL适合时间序列时
我们已经看到,时间序列数据管理市场已经分化为时间序列专用产品,使用它们自己的专用语言;以及可以与使用SQL的标准报告和业务智能工具互操作的扩展SQL系统。MemSQL属于第二类。MemSQL适用于需要快速查询,低延迟查询和高并发性的时间序列应用程序,没有扩展限制,并且受益于SQL语言功能和SQL工具连接。
许多特定于时间序列的产品在数据管理方面都有缺陷。有些应用程序缺乏扩展功能,限制了它们可以处理的问题的大小,或者迫使应用程序开发人员在代码中构建复杂的分片逻辑,以便在多个实例之间分割数据,这将耗费宝贵的人力资源,而这些人力资源可以更好地投入到应用程序业务逻辑中。其他系统的解释查询处理器无法跟上我们这样的最新查询执行实现。有些缺少SQL数据库常见的事务处理完整性功能。MemSQL让时间序列应用程序开发人员充满信心地前进,他们知道自己不会遇到规模瓶颈,并且可以使用所有熟悉的工具——任何可以连接到SQL数据库的工具。
总结
MemSQL是一个用于管理时间序列数据的强大平台。它支持快速方便地加载事件流的能力,并且可以无限扩展。它支持完整的SQL,可以使用SQL 92的所有标准功能,以及添加的窗口函数扩展来实现复杂的查询。它支持许多开发人员对各种应用程序(包括时间序列)所需的事务,高速并发更新和查询以及高可用性技术。而且,您最喜欢的SQL兼容工具可以连接到MemSQL,这使得MemSQL成为时间序列的强大平台。
版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly英文官网,若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒体、网站或其他任何形式的法律实体和个人使用,必须经过著作权人合法书面授权并自负全部法律责任。不得擅自使用腾讯云数据库团队的名义进行转载,或盗用腾讯云数据库团队名义发布信息。
往期推荐
《了解数据库分片(Database Sharding)》
《图数据库项目DGraph的前世今生》
《MySQL性能基准测试对比:5.7 VS 8.0》
《前沿观察 | 如何选择合适的数据库代理》
《谷歌新出SageDB:一个自学成才的数据库》

免费试用
包括云数据库MySQL在内的40+款热门云产品,实名认证的企业用户可免费试用!1000M内存50G数据盘的MySQL可免费体验30天,点击左下角“阅读原文”立即领取~

↓↓点“阅读原文”免费试用
好文和朋友一起看!
var first_sceen__time = (+new Date());if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); } (function(){ if (navigator.userAgent.indexOf("WindowsWechat") != -1){ var link = document.createElement('link'); var head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = "//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/winwx45ba31.css"; head.appendChild(link); } })();
Eric Hanson
赞赏
长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。
文章转载自公众号

腾讯技术工程
阅读原文
阅读
分享 在看
已同步到看一看
取消 发送
我知道了
确定

已同步到看一看写下你的想法
最多200字,当前共字 发送
已发送
确定
写下你的想法...
取消
确定
最多200字,当前共字
发送中
微信扫一扫 关注该公众号
微信扫一扫 使用小程序
即将打开""小程序
取消 打开