每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

众所周知,如果交互式响应时间小于四分之一秒,那么人们会获得令人难以置信的满意度。当你提供的响应时间下降到大约四分之一秒时,交互对用户而言是即时的。

但是,由于大数据集和并发需求,给所有客户提供的速度水平似乎无法实现。因此,开发人员有时会采用快捷方式,例如预计算。这可能会导致严苛的用户体验,如果稍微调整一些查询,例如添加一个额外的分组列,则它会突然变慢几个数量级。这也意味着你的交互不是实时的,即不是最新的数据。

MemSQL为你提供了用户需要的交互式响应时间,可以在庞大的数据集上并发访问,而无需诉诸预先计算的结果。

以每秒万亿行的速度运行

MemSQL号称世界上最快的分布式关系数据库,MemSQL 6于2017年末发布,它包含了用于以极快的速度对列存储数据执行单表分组/聚合查询的新技术。该实现基于以下方法:(1)直接对列存储中的编码(压缩)数据执行操作,(2)将查询编译为机器码,(3)向量化执行,以及(4)使用Intel AVX2单指令,多个数据(SIMD)增强。当按字段,整数值或运行长度编码分组列时,MemSQL以每个核心每秒超过30亿行的速度运行一个单一表组/聚合,速率达到峰值。组数越少,聚合函数越简单,MemSQL就越快。

这种令人难以置信的每核心速度给了我们尝试突破想法。为了实现这一点,我们用一个现实的查询编写了一个数据生成器来构建一个模拟纳斯达克股票交易的数据集。然后,我们与英特尔进行了沟通,他们慷慨地让我们使用最新的Skylake处理器访问其实验室中的服务器。这些机器每个都有两个Intel Xeon Platinum 8180处理器,每个处理器有28个内核,每个服务器总共56个内核。我创建了一个带有一个聚合器节点和八个叶节点的MemSQL集群,每个节点有一个服务器,如图1所示。该集群在树叶上有2 * 28 * 8 =448个核心。 最重要的数字决定了我们可以得到的整体每秒行数。

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

用于突破每秒万亿行的硬件配置。

在这个集群上安装了MemSQL,每个叶服务器上有两个MemSQL叶节点,启用了非统一内存访问(NUMA)优化,因此每个MemSQL叶节点软件进程都可以在专用的Skylake芯片上运行。然后,我创建了一个数据库交易,每个核心有一个分区以获得最佳的扫描性能。一旦完成,我将数十亿行代表股票交易(实际上几十年的交易)的数据载入名为交易的表格中。股票的大写字母越多,交易越多。这里有一小部分数据:

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

这导致了多少行?看一下这个:

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

没错,大约578亿行!

然后,我运行这个查询来查找历史上前十大交易股票:

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

并得到了这个结果:

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

10行(0.05秒)

是的,这个查询以百分之五的速度运行!为了获得准确的扫描速度,我们需要一些更有意义的数字。所以我写了一个存储过程在循环中运行100次:

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

这给查询的平均响应时间0.0451秒,这会产生以下扫描速率:

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

是的,那是每秒1.28万亿行!

通过对编码数据,矢量化和SIMD进行操作的完美,我们正在扫描和处理每个核心每秒28.6亿行。我们实际上在每一行都花费了一些时间,而不是预先计算结果,以实现这一目标。

这是什么意思?

事实上,我们能够通过MemSQL在448个核心的英特尔最新芯片上打破每秒1万亿次的记录,这在很多方面都非常重要。首先,你可以在庞大的数据集上获得交互式响应时间,而无需预先计算结果。这允许用户进行更灵活的交互,并鼓励他们探索数据。它还支持实时分析。其次,它允许数百个用户在较小的数据集上进行高度并发的访问,所有这些用户都可以获得交互式响应时间。再次,这些用户将从最新数据中获得分析的好处,而不是预先计算的摘要快照。MemSQL通过标准SQL启用所有这些,开发人员已经接受过使用这些标准SQL的培训。

此外,我们在英特尔的行业标准硬件上实现了这一目标,而不是专用数据库机器。这些是企业可以购买的机器,或者可以从你最喜爱的云提供商租用的机器。