各位新朋友~记得先点蓝字关注我哦~
关注我们的公众号“新运维新数据”,观看前三部,不错过以后每一部。
武林盟主之争
本来是个“挖掘机技术哪家强”的事,结果给唠成一个系列了。从Monty执著的技术人生,到斯通布雷克的封神之路,扯的的确有点远了。
回归正题,谁,才是新一代武林盟主?

首先介绍一下登场选手。
1号选手,MySQL:

热情美丽、妩媚动人的My,今年芳龄。。。。。。,
停,拿错剧本了,换图:

MySQL的出场台词只有一句话:“我是使用最广泛的数据库(没有之一)。”
(注,其实使用最广泛的、能称的上数据库的软件,是SQLLite,每部手机中几乎都有一个。当之无愧的使用最广,但它太小型了,不在我们的讨论范围之内)
2号选手,PostgreSQL:

出场台词:我是公认的最好的数据库。
除了1、2号选手外,请允许我隆重请出压阵的3号选手,Oracle。

拉里.埃里森:十几年前我就开着飞机上云了,现在你们说我不是云数据库!
好了,登场选手先介绍到这儿。比赛过程是这样的,我们集合团队中十年以上经验Oracle、MySQL、PG方面的人员,在同一台机器上安装MySQL 5.7, PG 12与Oracle 19c。选用同一款压测软件:sysbench,对三位选手分别进行了多轮的测试。
测试机的配置比较平民化,两块普通硬盘加一块SSD,做一个逻辑卷,SSD做为硬盘的缓存。
所以最终压测的TPS并不会很高,主要是三个选手互相间的较量。
罗里吧嗦这么多,不扯了,上结果。

数据安全测试
第一轮比试,保证数据安全,哪怕突然reboot、断电,也要有完善的redo、日志可供恢复。这是生产环境的基础要求。
在这个要求下,MySQL肯定要双1了
(sync_binlog和innodb_flush_log_at_trx_commit都设为1)。
PG的synchronous_commit一定要设为on。
结果如下:
数据库 | TPS(每秒事务数) |
![]() | 1288.33 |
![]() | 2159.82 |
![]() | 526.64 |
怎么样,这个结果,惊不惊喜。
PG的TPS远高于MySQL和Oracle。
MySQL低于PG也好理解,毕竟Binlog和Redo,一是逻辑日志,另一个则是物理日志,写了两遍日志。一旦日志I/O到达瓶颈,对TPS的影响是最大的。
号称地上最强的Oracle,竟然远远落后于MySQL/PG。
Oracle的瓶颈在redo,等待事件全是log file sync。
MySQL/PG的瓶颈也是日志的I/O。
Oracle性能最差的原因,并不是Oracle廉颇老矣,也不是Oracle太差,而是Oracle太好。为了追求最高的并发度,Oracle的锁粒度是最细的。最简单的、竞争并不激烈的系统中,过细的锁粒度反而拖慢了性能。
sysbench其实只是简单的性能压测,SQL十分简单,压测结果也只有简单的参考意义。
如果以sysbench这种简单压测为依据,决定使用某种数据库,是十分盲目、且危险的。我在另一篇文章,《数据库传奇 digg启示录》中,有一个因为测试不充分就改换数据库导致灾难的例子,有兴趣可以读读。
我使用了以下的sysbench选项:
--oltp_tables_count=8 :压测共针对8个表
--oltp-table-size=5000000 :表大小为五百万行。
--max-time=180:时间为180秒
--num-threads=32 :在我的测试机上,32线程时每个数据库的TPS最高。
--report-interval=2:两秒显示一次TPS等压测数据。
--oltp-read-only=off:关闭只读模式。后面会有只读模式的测试。
--oltp_point_selects=8:单行查询SQL的数量因子为8。数量因子越高,对应的SQL越多。
--oltp_index_updates=2:更新索引列SQL的数量因子为1。
--oltp_simple_ranges=1:范围查询SQL的数量因子为1。
--oltp_distinct_ranges=1:distinct SQL的数量因子为1。
复制
有兴趣的朋友也可以找台机器测试一下试试。
下面,开始第二轮比试。
速度测试
第二轮比试:不保证数据安全,就看谁跑的更快。
MySQL binlog关掉,不要binlog了,innodb_flush_log_at_trx_commit设为0。
PG的synchronous_commit也相应的设为off。
Oracle将commit_wait设置为NOWAIT。
比试结果如下:
数据库 | TPS(每秒事务数) |
![]() | 1793.22 |
![]() | 2608.96 |
![]() | 685.03 |
MySQL、PG都比前一轮测试多了500左右的TPS,Oracle增加不大。
本轮比武,PG仍然拔得头筹。
其实这样的测试,是有利于PG的。
因为PG的vacuum对TPS还是有影响的,但180秒的测试,并不会触发vacuum。因此这种短时的测试,PG得分很高并不意外。但是比Oracle高出那么多,比MySQL也高了很多,还是很令人惊喜的。
只读测试
下面,开始最后一轮测试,纯只读测试。
第三轮比试:只读测试。
数据库 | TPS(每秒事务数) |
![]() | 2271.11 |
![]() | 3364.67 |
![]() | 1095.93 |
PG仍然毫无悬念的排在第一位,纯读TPS是MySQL的1.48倍,是Oracle的3.07倍。
这个测试结果出乎你的意料吗?
综合所有三轮比试,PG在性能方面都高于MySQL、Oracle,不愧是图灵奖大师斯通布雷克操刀的数据库,“公认最好数据库”之名,当之无愧。

那么问题来了,PG这么优秀的一个数据库,为什么使用广度就是赶不上MySQL呢?
相信这次武林大会的结果已经出乎意料了,给你留点时间继续震惊一会,关注公众号“新运维新数据”,后续文章,将继续为您揭晓。
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。