百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

为了证明它的速度,一口气对比了 Oracle、MySQL、Greenplum ....

sinye56 2024-10-20 13:03 10 浏览 0 评论

上篇文章 中,我们简单介绍了 TiFlash 的设计和架构,TiFlash 是即将随着 TiDB 3.1 版本发布(3月)的列存引擎,大幅提升了 TiDB 在实时分析场景下的性能。同时和 TiDB 体系无缝结合,可实时更新,弹性扩展,保持 TiDB 的 ACID 事务特性和快照隔离级别,可用于严肃场景的实时分析。

那么 TiFlash 到底有多快?

为了更直观回答这个问题,我们用最新版本的 TiFlash 进行了一次全新的对比测试。测试选取了传统交易型数据库(及其列存扩展),分析型数据库和大数据计算引擎进行对比,分别是 Oracle、MySQL、MariaDB ColumnStore、Greenplum 和 Apache Spark。

其中 MySQL 可以承担在线交易业务,但是分析速度对比针对分析场景特化的产品就相当堪忧;而列存数据库则无法承担在线交易,无论是无更实时新存储结构还是高频少量数据访问性能都很难符合在线交易业务要求。

而 TiDB 作为 HTAP 数据库,在交易场景已经大量验证的前提下,加上 TiFlash 后在分析侧又能达到怎样的性能呢?借助 TiFlash 的一致性数据同步特型,用户可否以一个优异的速度直接对实时数据进行分析呢?

这次我们一起来看一组来自美国交通部的有趣数据,它包含了从 1987 至今的飞机起降和准点情况。 大家可以使用 Percona Lab 的 下载脚本 获取数据集。数据集总共为一亿八千多万行飞机起降记录。数据集的表结构在 这里。

测试所用查询见后文,我们先来看看对比结果:



注:为了不影响比例,上图忽略了 MySQL 和 Oracle 数据。

从上面的对比可以看出,

  • 相对 MySQL 而言,单机环境下可达到数百倍提升(更不用提 TiFlash 可扩展);
  • 而对比 MPP 数据库或者新 MariaDB ColumnStore 等无法实时更新的分析型数据库 / 引擎,仍然可达数倍乃至十倍的性能提升。

如下十条为测试分析查询所用的 SQL。

查询 1:平均每月航班起降记录数

select avg(c1) from 
( select year, month, count(*) as c1 from ontime group by year, month ) A;

查询 2:2000 年到 2008 年的每日航班数

select dayofweek, count(*) as c from ontime 
where year>=2000 and year<=2008 group by dayofweek 
order by c desc;

查询 3:按星期统计 2000 年到 2008 年延误(10 分钟以上,下同)的航班数

select dayofweek, count(*) as c from ontime 
where depdelay>10 and year>=2000 and year<=2008 group by dayofweek order by c desc;

查询 4:按出发机场统计 2000 年到 2008 年延误数

select origin, count(*) as c from ontime 
where depdelay>10 and year>=2000 and year<=2008 group by origin order by c desc limit 10;

查询 5:按照航空公司统计 2007 年延误数

select carrier, count(*) from ontime 
where depdelay>10 and year=2007 group by carrier 
order by count(*) desc;

查询 6:按照航空公司统计 2007 年延误比例

select carrier, c, c2, c*100/c2 as c3 from 
(select carrier, count(*) as c from ontime where depdelay>10 and year=2007 group by carrier ) A 
inner join 
( select carrier, count(*) as c2 from ontime where year=2007 group by carrier ) B using (carrier) 
order by c3 desc;

查询 7:按照航空公司统计 2000 到 2008 年延误比例

select carrier, c, c2, c*100/c2 as c3 from 
( select carrier, count(*) as c from ontime where depdelay>10 and year>=2000 and year<=2008 group by carrier ) A 
inner join 
( select carrier, count(*) as c2 from ontime where year>=2000 and year<=2008 group by carrier ) B using (carrier) 
order by c3 desc;

查询 8:按年统计航班延误率

select year, c1/c2 from ( select year, count(*)*100 as c1 from ontime where depdelay>10 group by year ) A 
inner join 
( select year, count(*) as c2 from ontime group by year ) B using (year) 
order by year;

查询 9:每年航班数

select year, count(*) as c1 from ontime 
group by year;

查询 10:多维度复杂过滤和聚合

select min(year), max(year), carrier, count(*) as cnt, sum(arrdelayminutes>30) as flights_delayed, round(sum(arrdelayminutes>30)/count(*),2) as rate from ontime 
where dayofweek not in (6,7) and originstate not in ('ak', 'hi', 'pr', 'vi') and deststate not in ('ak', 'hi', 'pr', 'vi') and flightdate < '2010-01-01' 
group by carrier having cnt>100000 and max(year)>1990 
order by rate desc limit 1000;

真 · 行列混合

别忘了还有行存。TiDB 不但拥有 TiFlash 列存引擎,也同时拥有相应的行存和配套的细粒度索引支持。

对于唯一值个数非常高的列(例如一个具体的时间,产品唯一序列号等等),一般来说列存很难有良好的手段进行精确过滤。例如在上述 OnTime 数据集中,对 CRSDepTime 计划起飞时间列进行索引,同样的查询还能变得更快。

统计所有在 18:45 分计划起飞的飞机总数。

mysql> select count(*) from ontime where 1845 = CRSDepTime;
+----------+
| count(*) |
+----------+
|   766539 |
+----------+
1 row in set (0.09 sec)

而纯粹使用列存,在 MariaDB,Spark 以及 Greenplum 中,这样的查询分别是 0.447 vs 0.449 以及 1.576 秒——与 TiDB + TiFlash 存在 4 至 17 倍速度差!因为他们必须暴力扫表。

除此以外,TiDB 的行列混合并不是传统设计上的行存列存二选一,而是 TiDB 可以在同一张表同时拥有行存和列存,且两者永远保持数据强一致(而非最终一致)。

看到这里也许你要问,TiDB 同时拥有行存和列存是否反而会给用户带来心智负担?答案是并不会。何时使用行存或者列存,除了用户可以为了 HTAP 业务隔离而强制选择以外,你完全可以委托给 TiDB 自行选择。当行存更优(例如上面的案例),TiDB 则会凭借统计信息自动切换到行存进行读取:上面的查询在 TiFlash 上的性能只有 TiKV 行存 + 索引的一半。

更快的数据到达

由于为配合 TiDB 数据镜像同步而设计的可高频更新列存引擎,使得 TiFlash 得以高速更新数据。这使得它的「快」不仅仅是「高速返回查询」,也意味着「数据能更快被查询到」。

相较于传统的分析型数据库或者 Hadoop 数据湖需要从源数据库 T + 1 批量加载(往往是一天),TiFlash 的可以读取到最新的(而非仅仅是新鲜的)数据,且你无需关心数据到达乱序或者一致性问题。相比维护额外的数据复制作业,你不但精简了架构,也可以更实时地访问数据。

何不试试看?

另外,TiFlash 上线测试非常简单,你可以使用一两台现成的机器进行测试,简单一两条命令,上线 TiFlash 节点,添加列存副本,等副本同步完成之后就可以看到效果,绿色无害。TiFlash 已经在进行第一轮用户测试,并在 3 月会开启开放公测,请关注后续信息,也欢迎联系询问提前体验 maxiaoyu@pingcap.com

附本文测试环境

由于部分测试对象不支持集群模式,测试环境为单机(但是借助 TiDB 的可扩展体系,TiFlash 也可以进行无缝线性扩展)。测试机规格和配置如下:

CPU: 40 vCores, Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz @ 1268.383 MHz Mem: 188G @ 2133 MHz

1 x NVMe SSD 3.6T

OS: centos-release-7-6.1810.2.el7.centos.x86_64

Filesystem: ext4

TiKV Region Size: 512M

Greenplum 16 Segments (DISTRIBUTED RANDOMLY)

Oracle noparallel

如果外链失效请到 PingCAP 官网博客查看原文。

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&amp;配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: