前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谁是世界上最成功的数据库?

谁是世界上最成功的数据库?

原创
作者头像
DBA成江东
修改2023-09-19 09:22:39
9470
修改2023-09-19 09:22:39
举报
文章被收录于专栏:数据库之巅数据库之巅

导语

2023 年StackOverflow《2023 技术调查》出炉,PostgreSQL 在数据库全部三项调研指标(流行度,喜爱度,需求度)上获得冠军,并以 45.55% 的使用率,超过 MySQL(41.09%),成为最受欢迎的数据库。那么,PostgreSQL是世界上最成功的数据库了吗?我的结论是否定的。

1 背景

https://survey.stackoverflow.co/2023/#most-popular-technologies-database

StackOverflow《2023 技术调查》中,PostgreSQL超越MySQL成为了最受欢迎的数据库。专业的开发者更倾向于使用PostgreSQL(有50%的人选择使用),而那些正在学习编程的人则更喜欢使用MySQL(有54%的人选择使用)。

于是有同学得出结论:

PostgreSQL现在是全世界最流行的数据库! PostgreSQL是开发者最喜爱欣赏的数据库! PostgreSQL是用户需求最为强烈的数据库!

这个结论可谓一石激起千层浪,在数据库社区引起了大量的争论。

那么这个结论正确吗?让我们一步步来分析。

2 成功的定义

在讨论哪个数据库是世界上最成功的之前,首先要明确"成功"的定义。"成功"可以基于流行度、技术特点、应用领域、受欢迎度等多种因素来定义。

如果我们以流行度来看,那无疑DB-Engines排名更权威,为什么这样说呢?一个是DB-Engines聚焦于数据库领域,更为专业。另外,DB-Engines排名的计算方法更全面、更科学。我们看下它的计算方式:

DB-Engines排名是按其当前受欢迎程度对数据库管理系统进行排名的一个列表。我们如何衡量一个系统的受欢迎程度呢?

  1. 在网站上的提及次数:我们查看在搜索引擎(目前我们使用的是Google和Bing)中这个系统的提及次数。为了只计算相关结果,我们搜索系统名称和“数据库”这个词,例如“Oracle”和“数据库”。
  2. 系统的普遍兴趣:我们使用Google Trends来查看系统的搜索频率。
  3. 关于系统的技术讨论的频率:我们根据著名的IT相关问答网站Stack Overflow和DBA Stack Exchange上的相关问题和感兴趣的用户数量来衡量。
  4. 提及系统的工作机会数量:我们查看主要的工作搜索引擎Indeed和Simply Hired上提及该系统的工作机会数量。
  5. 在专业网络上的个人资料数量:我们查看在最受欢迎的国际专业网络LinkedIn上提及该系统的个人资料数量。
  6. 在社交网络中的相关性:我们计算提及该系统的Twitter推文数量。

我们通过标准化和平均各个参数来计算系统的受欢迎程度。这些数学变换是为了保持各个系统之间的差距。也就是说,当系统A在DB-Engines排名中的值是系统B的两倍时,那么在平均评价标准上,它的受欢迎程度也是系统B的两倍。

为了消除数据源数量变化所引起的影响,受欢迎分数总是一个相对值,只应与其他系统进行比较。

DB-Engines排名并不衡量系统的安装次数或其在IT系统中的使用情况。可以预期,系统受欢迎程度的增加(如在讨论或工作机会中)会在系统广泛使用之前预先出现。因此,DB-Engines排名可以作为一个早期指标。

可以看到上面的计算方法里面已经包括了Stack Overflow上的相关问题和感兴趣的用户数量指标,同时还包括搜索引擘、招聘网站、社交网站的指标,非常的合面。而用户覆盖面也是千万到亿级用户,而参与StackOverflow《2023 技术调查》数据库部分的只有不到8万人,用这个数据来说明谁是最流行的数据库太偏颇了。

我们看下DB-Engines最新的数据库排名,可以看到前4名都是关系型数据库,其中Oracle是第1名,但它是收费的,而且在当前信创的大背景下,在中国的市场份额一定是越来越小的。第2名就是MySQL,是第4名PostgreSQL分数的2倍,可见当前MySQL才是最流行的数据库。

3 分布式数据库不是伪需求

有同学说分布式数据库的核心权衡是:“以质换量”,牺牲功能、性能、复杂度、可靠性,换取更大的数据容量与请求吞吐量。但分久必合,硬件变革让集中式数据库的容量与吞吐达到一个全新高度,使分布式(TP)数据库失去了存在意义。 以 NVMe SSD 为代表的硬件遵循摩尔定律以指数速度演进,十年间性能翻了几十倍,价格降了几十倍,性价比提高了三个数量级。单卡 32TB+, 4K随机读写 IOPS 可达 1600K/600K,延时 70µs/10µs,价格不到 200 ¥/TB·年。跑集中式数据库单机能有一两百万的点写/点查 QPS。 真正需要分布式数据库的场景屈指可数,典型的中型互联网公司/银行请求数量级在几万到几十万QPS,不重复TP数据在百TB上下量级。真实世界中 99% 以上的场景用不上分布式数据库,剩下1%也大概率可以通过经典的水平/垂直拆分等工程手段解决。

上面的观点非常片面,我举一个例子,微信商业退款要求5年内的订单都能退,而微信商业订单的量级是1天20亿级,1年万亿级,5年数据量在PB级,如果用单机版的数据库,单个数据库肯定搞不定,而水平拆分无论是对运维还是开发来说,管理难度和成本都非常高,实际上早期使用过单体数据库来存储历史数据,并且还使用了高压缩比的tokuDB引擘和大容量磁盘,但随着数据量的不断增长,以及不同业务的历史数据增长情况不同,经常出现有的历史库写满,有的很空闲,需要经常调整写入策略和读取路由。如果单个节点的磁盘故障,因为单个实例容量太大,重做数据的时间也非常长。

所以这里选择用分布式数据库如TDSQL更合适。分布式数据库将分片管理、路由管理都交给了存储层,业务层只需要关注于业务逻辑开发,像使用单体数据库一样进行开发,大大减轻了业务开发和运维的复杂度,也提升了可用性。

TDSQL计算层实际上就是MySQL。

4 打榜TPC-C意义重大

有同学说 TPC-C 是 30 年前的测试标准,是过时的标准,而且可以通过堆机器的方式提升性能。

我们先看下什么是TPC-C,它的要求是什么?

如上图所示,TPC-C对性能的要求是非常严格的,要求8小时不能有任何错误,并且tmpC波动率小于2%。除了性能这外,还关注成本、和稳定性,并不是堆机器就可以的。

2019年-2020年,蚂蚁金服OB先后两次完成了国内数据库厂商的首次TPCC打榜,而且第二次打榜直接跑到7.07亿tpmC。

2023年1月-2月,腾讯云进行了一次打榜,在3月份正式发布了打榜结果,如下图所示:实现了吞吐量(tpmC)和性价比(Price/tpmC)的双榜世界第一。

为什么数据库Oracle,IBM不打榜了?不是因为不想,而是因为集中式的数据库的吞吐量受限于单机性能其上限比计算层和存储层可以分别进行自动化扩容的分布式数据库要低很多,从榜单来看,分布式数据库的tmpC比集中式数据库高1个数量级。

6 全面对比MySQL/PostgreSQL

刚才提到,最受欢迎的数据库前4名是Oracle,MySQL,SQL Server, PostgreSQL,但Oracle,SQL Server是商业数据库,不开源,在当前信创的环境下未来在中国的市场只会越来越小,所以我们全面对比下MySQL/PostgreSQL:

6.1 事务内语句失败是否回滚

代码语言:javascript
复制
BEGIN;
INSERT INTO t VAVLUES (1,...);
INSERT INTO t VAVLUES (1,...); -- 主键冲突,报错
COMMIT;

SELECT * FROM t;
-- 得到1这条记录

让我们看下这个上面这个例子,这个事务在MySQL和PostgreSQL中的执行结果有差异。

在MySQL中,用户选择 COMMIT 而不是 ROLLBACK,第1条insert会写入成功,而 Oracle 、Microsoft SQL Server 也支持这样的行为特性。

通过设置参数 sql_mode ,MySQL 也可以遇到单条更新语句失败后立即退出。

所以这是更多的是一个特性,由用户自主选择遇到单条语句错误是否提交或者回滚事务,而不是所谓的BUG。

6.2 开源协议

PostgreSQL License是一个宽松的开源许可证,类似于MIT许可证。它允许用户自由使用、修改和分发,无需公开源代码。它也不强制任何特定的版权声明,这使得它与许多其他开源和专有许可证兼容。

MySQL采用GPLv2是一个“传染性”的开源许可证,这意味着任何基于GPLv2许可的代码进行修改或扩展,并且要分发的派生作品,也必须在GPLv2下发布。这确保了软件的自由性,但也可能限制了与非GPL软件的集成。

通俗来说,PostgreSQL License支持第三方进行修改后商业化,还可以不开源。但GPLv2协议要求任何基于GPLv2软件的衍生作品也必须是开源的,所以第三方的优化成果最终也会反馈给社区。长期来看,GPLv2协议更能带动开源社区的发展。

6.3 MVCC实现机制

PostgreSQL将历史元组和最新元组都保存在Heap表中,这种方式的好处是无须做回滚操作,如果一个写事务异常终止,则其他事务将无法读到这条元组。 此方法虽然可以避免事务回滚带来的消耗,但仍被广为诟病。假设一个事务不停地更新数据,那么一条元组就会产生大量的历史版本。其他事务在访问时需要查看这些元组是否满足可见性要求,这会增加读操作的时延,降低数据扫描的效率。 为了防止数据膨胀,PostgreSQL数据库采用Vacuum机制清理表中的无效元组。如果使用Vacuum FULL命令,则还会负责对所有的元组进行搬迁,避免清理页面的过程中产生大量的“空洞”。

MySQL、Oracle采用了一种基于“回滚段”的方法来保存元组的历史版本(前像),如果事务更新了一条元组,它可以“原地”更新这条元组(新元组的Size需要小于等于旧元组的Size),历史元组会以Undo日志记录的形式保存到回滚段中,这样就实现了元组的原地更新(Inplace Update)。当有并发事务需要访问历史元组时,可以从回滚段中“回滚”出这条元组,如果事务异常终止,则可以利用Undo日志将数据恢复。当所有可能访问历史元组的事务全部结束后,Undo日志中的历史元组就可以被清理。由于Undo日志被集中存储到某一个回滚段,所以清理也较为便捷。

这一块的处理无疑MySQL更合理。

6.4 多进程VS多线程

PostgreSQL采用多进程

优点:

稳定性:由于每个连接都有自己的进程,一个进程崩溃不太可能影响其他进程。这为系统提供了额外的稳定性。 内存隔离:每个进程都有自己的内存空间,这可以减少内存泄漏或其他问题对整个系统的影响。 开发简单性:多进程模型在某些情况下可能更容易开发和维护。

缺点:

资源开销:进程通常比线程需要更多的资源。每个进程都有自己的内存空间,这可能导致更高的内存使用。 上下文切换:进程之间的上下文切换可能比线程之间的上下文切换更加昂贵。 进程间通信:进程间通信(IPC)可能比线程间通信更复杂和开销更大。

MySQL采用多线程

优点:

资源效率:线程共享相同的内存空间,这通常导致更低的内存使用和更快的上下文切换。 高并发性:多线程模型通常能够更好地处理高并发情况,尤其是在多核CPU上。 线程间通信:线程间通信通常比进程间通信更简单和更快。 适合短暂任务:对于短暂的、需要快速响应的任务,多线程模型可能更为合适。

缺点:

稳定性问题:一个线程的问题可能会影响到同一进程中的其他线程。例如,一个线程导致的内存泄漏可能会影响整个进程。 复杂的同步:在多线程环境中,数据同步和锁定可能会变得更加复杂。 全局变量和静态变量:由于线程共享内存,全局变量和静态变量的使用可能会导致问题。

既然开发难度上说多线程比多进程难,为什么MySQL选择了多线程呢?正如一个优秀的骑手与马合为一体,Monty(MySQL的创始人)也与计算机融为一体。他无法忍受看到系统资源被浪费。他对自己有足够的信心,认为自己能够编写几乎没有错误的代码,处理线程带来的并发问题,甚至能够在小的堆栈上工作。这是一个令人兴奋的挑战!不用说,他选择了线程模型。--From《Understanding MySQL Internals》

PostgreSQL选择多进程的原因:多线程要求构建一个相当完整的特定目的操作系统。相比之下,每用户一个进程的模型更简单实现,但在大多数常规操作系统上的性能可能不会那么好。经过深思熟虑,由于我们的编程资源有限,我们决定使用每用户一个进程的模型来实现POSTGRES-- From《The design of Postgres》

概括来说,主要是当年操作系统对线程支持不给力,开发难度也更大,所以早期一般使用多进程。而MySQL是特例,因为创始人Monty喜欢挑战,另外一个原因是MySQL后于Oracle和POSTGRES,那个时候操作系统的线程支持已经基本完善了。

6.5 表组织形式

PostgreSQL堆表: 数据存储在一个称为"堆"的无序结构中。 索引存储指向堆中行的指针(CTID),而不是实际的行数据。

优点

  1. 简单性:堆表是最基本的表结构,不需要特定的排序或组织。
  2. 快速插入:数据可以迅速地添加到表的末尾,不需要重新排序或调整数据。
  3. 灵活性:可以轻松地添加或删除索引,而不影响表的基本结构。

缺点

  1. 查询速度:由于数据没有特定的组织方式,查询可能需要全表扫描,尤其是在没有索引的情况下。
  2. 空间使用:可能会有更多的碎片,因为删除的行可能不会立即被回收,需要额外的操作如表重组来回收空间。

MySQL索引组织表:

数据直接存储在主键索引的叶子节点中,这意味着表数据按主键的顺序存储。 由于数据与主键索引紧密结合,所以通常可以更快地访问基于主键的查询。

优点

  1. 查询性能:由于数据是按键值排序的,范围查询和某些类型的查找可以更快。
  2. 空间效率:通常使用较少的磁盘空间,因为它们减少了数据的冗余和碎片。
  3. 数据完整性:由于数据是按键值存储的,这可以确保数据的完整性和一致性。

缺点

  1. 插入和更新开销:插入或更新数据可能需要重新组织表,以保持键值的排序。
  2. 复杂性:管理和维护索引组织表可能比堆表更复杂。
  3. 特定的用途:索引组织表主要适用于查询密集型的应用,而不是频繁的插入和更新操作。

6.6 其它项目对比

可以看到PostgreSQL在复杂查询性能,以及功能丰富性上有一定优势,但MySQL更专注,在OLTP领域表现更好。

7 结论

Postgre虽然功能更丰富,对复杂查询的优化做得更好。但MySQL抓住了互联网发展的红利,通过大量高并发、海量数据的OLTP业务证明了自己的一致性、性能、可靠性、可运维性,在流行度上过去和现在都是超过PostgreSQL很多,是当前最成功的数据库。

目前中国日交易量在20亿级别的OLTP金融级业务:财付通使用的是TXSQL(腾讯云数据库内核版本,完全兼容MySQL),支付宝使用的是OceanBase,而兼容MySQL的工作一直是 OceanBase 团队长期工作的重点,也从侧面证明了MySQL的成功。

参考文献

  1. 破产码农:MySQL:这个星球最成功的数据库 https://mp.weixin.qq.com/s/uiGAo5PzIuQwTm5RtKPR3w
  2. 冯若航:PostgreSQL:世界上最成功的数据库 https://mp.weixin.qq.com/s/xewE87WEaZHp-K5hjuk65A
  3. 白鳝:PG离企业核心应用数据库还有多远 https://mp.weixin.qq.com/s/7gbLK0qNjS_9Wm39f-eS2Q
  4. 郭庆慧:神仙打架:PG和MySQL到底选啥? https://mp.weixin.qq.com/s/47vVzcnyH5rzpEwqiZFKKw
  5. 郭庆慧:PG Vs MySQL ,到底谁更强? https://mp.weixin.qq.com/s/jfbL-wgba16c4Sx3nOIEww
  6. 清道夫:MySQL vs PG,谁赢了? https://mp.weixin.qq.com/s/1MUVPvKAhLceFVwIGAiPGQ
  7. 芬达橙:MySQL vs PG 到底谁赢了 https://mp.weixin.qq.com/s/GtA5i6wBVOey4ig3wAY66w
  8. 白鳝:MYSQL与PG为啥非要争个谁好谁坏呢? https://mp.weixin.qq.com/s/DvViJXu3SMkSijnboE1Lcg

公众号"数据库之巅"记录了我在互联网金融数据库运维中走过的路和踩过的坑,感兴趣的同学可以关注。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • 1 背景
  • 2 成功的定义
  • 3 分布式数据库不是伪需求
  • 4 打榜TPC-C意义重大
  • 6 全面对比MySQL/PostgreSQL
    • 6.1 事务内语句失败是否回滚
      • 6.2 开源协议
        • 6.3 MVCC实现机制
          • 6.4 多进程VS多线程
            • 6.5 表组织形式
              • 6.6 其它项目对比
              • 7 结论
              • 参考文献
              相关产品与服务
              云数据库 MySQL
              腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档