作为MySQL技术专家,我写过MySQL系列丛书《MySQL技术大全:开发, 优化与运维实战》, 有挺多准备上云企业的DBA或者架构师同学询问,如何对市场上五花八门的数据库进行选型, 我觉得首先是稳定性, 然后就是性能。今天,我就针对PolarDB、OceanBase、Aurora、GaussDB、TDSQL-C这五款数据库产品做个开箱性能评测供企业选型参考。
评测总览
为了方便读者更好的了解本次性能评测的整体结论,首先给出测试结果的总览图和相关结论:
在小规格实例(8C)的性能测试中,无论是在计算密集型场景还是在I/O密集型场景,各类测试负载下,PolarDB整体的测试性能是最好的.
对于大规格实例(64C),各数据库实例间的性能差距更为明显。值得一提的是,在测试负载下Aurora写性能明显较差。整体而言,PolarDB性能相比于Aurora、TDSQL-C、Oceanbase和GaussDB等同类竞品同样具有较为显著的优势。
图. 大规格实例(64C)性能测试结果
图.小规格实例(8C)性能测试结果
压测情况
本次参与压力测试的数据库包括了阿里云的PolarDB数据库, 亚马逊云的Aurora数据库,蚂蚁集团100%控股的数据库OceanBase数据库,华为云的GaussDB数据库,以及腾讯云的TDSQL-C数据库。参与评审的都是MySQL 兼容版。
压测环境
为了保证压测结果的公平性,五个数据库均部署在各自的数据库厂商所在的云服务器上,且每个数据库所在的服务器实例规格都一样,云服务器实例规格都是8C64GB和64C512GB、MySQL 8.0,一主一从。
但OceanBase数据库由于规格限制,实际上,采用的云服务器实例规格为62C400GB。
在实例规格一致(除OceanBase使用62C400GB规格)的前提下,我们在各自的云服务器上都是采用的开箱配置。
压测配置
我们会对五个数据库的压力测试采用计算密集型和I/O密集型两种配置方式,并且会采用在配置上严格一致的shell脚本来进行压测。
计算密集型配置方式
对于计算密集型配置方式来说,压测五个数据库时,最终的结果信息将按如下格式进行输出。
case
数据库名称;数据表的数量;数据表大小(每张表中数据的条数);
;最大线程数量;最小线程数量;
云服务器实例名称;对应线程数目的QPS;对应线程数目的QPS;
这里,对上述输出结果的格式进行简要说明:
- case:表示压测数据库时采用的数据库读写模式,主要的取值分为:oltp_read_only(只读模式)、oltp_read_write(读写模式)、oltp_write_only(只写模式)。
- 数据库名称:压测数据库时指定的数据库名称,例如我们在对数据库采用计算密集型的配置方式进行压测时,指定的数据库名称为tpk_s。
- 数据表的数量:压测数据库时指定的数据库中数据表的数量,例如我们在对数据库采用计算密集型的配置方式进行压测时,每个数据库中指定的数据表数量为10。
- 数据表大小:压测数据库时指定每张数据表中数据的大小,例如我们在对数据库采用计算密集型的配置方式进行压测时,每张数据表中的数据大小为10000000。
- 线程数量:这个就比较好理解了,压测数据库时,指定采用多少个线程开始压测。例如我们对数据库采用计算密集型的配置方式进行压测时,在8C64GB规格下,最大线程数量为128,最小线程数量为1。在64C512GB规格下,最大线程数量为300,最小线程数量为1。
- 云服务实例名称:数据库所在的云服务器实例名称,注意这里不是压测脚本所在的云服务器实例名称。
- 对应线程数目的qps:按照格式分别输出的最大线程数目和最小线程数目对应的QPS。
I/O密集型配置方式
对于I/O密集型配置方式来说,压测五个数据库,最终的结果信息将按照如下格式进行输出。
case
数据库名称;数据表的数量;数据表大小(每张表中数据的条数);
;最大线程数量;最小线程数量;
云服务器实例名称;对应线程数目的QPS;对应线程数目的QPS;
可以看到,采用I/O密集型的配置方式进行压测与采用计算密集型的配置方式进行压测输出的结果格式是相同的。但进行实际压测时,二者的配置信息存在稍许差异。
- 计算密集型方式的数据库名称为tpk_s,而I/O密集型的配置方式数据库名称为tpk_l。
- 计算密集型方式的数据表大小为10000000,而I/O密集型的配置方式在8C64GB规格下,数据表大小为40000000。在64C512GB规格下,数据表大小为300000000。
以下是综合对比结果, 具体每一个产品PolarDB、OceanBase、Aurora、GaussDB和TDSQL-C 的测试在文章末尾, 感兴趣的小伙伴可以参考对比.
综合对比
8C64GB规格综合对比
为了更加直观的对比每款数据库在8C64GB规格下的性能,这里我将在8C64GB规格下的压测结果数据进行整合对比,如下所示。
计算密集型压测结果对比
(1)oltp_read_only模式压测对比
数据库 | 128线程QPS | 1线程QPS |
PolarDB | 95863.56 | 5184.38 |
OceanBase | 61068.59 | 1953.32 |
Aurora | 69933.45 | 3183.13 |
GaussDB | 85244.76 | 5638.32 |
TDSQL-C | 94343.16 | 4091.835 |
(2)oltp_read_write模式压测对比
数据库 | 128线程QPS | 1线程QPS |
PolarDB | 82701.53 | 4809.97 |
OceanBase | 39874.51 | 1801.23 |
Aurora | 42649.67 | 2465.01 |
GaussDB | 58522.77 | 4896.80 |
TDSQL-C | 61997.33 | 2661.6075 |
(3)oltp_write_only模式压测对比
数据库 | 128线程QPS | 1线程QPS |
PolarDB | 96784.14 | 4617.05 |
OceanBase | 31767.13 | 1648.32 |
Aurora | 35598.10 | 1484.75 |
GaussDB | 58697.92 | 2216.81 |
TDSQL-C | 53867.95 | 1799.2725 |
从我对五款数据库进行计算密集型压测结果的综合对比可以看出,在oltp_read_only模式下、oltp_read_write模式下和oltp_write_only模式下,开启1或128个线程压测时,PolarDB性能最好。
I/O密集型压测结果对比
(1)oltp_read_only模式压测对比
数据库 | 128线程QPS | 1线程QPS |
PolarDB | 67105.08 | 2943.15 |
OceanBase | 33997.1 | 1684.21 |
Aurora | 30695.90 | 1056.77 |
GaussDB | 24423.91 | 1927.34 |
TDSQL-C | 48069.14 | 2032.22 |
(2)oltp_read_write模式压测对比
数据库 | 128线程QPS | 1线程QPS |
PolarDB | 61093.90 | 2891.23 |
OceanBase | 29325.76 | 1582.34 |
Aurora | 21751.73 | 683.03 |
GaussDB | 23178.85 | 1703.34 |
TDSQL-C | 38388.89 | 1667.94 |
(3)oltp_write_only模式压测对比
数据库 | 128线程QPS | 1线程QPS |
PolarDB | 61438.08 | 2602.82 |
OceanBase | 29876.21 | 1503.22 |
Aurora | 23290.39 | 1001.32 |
GaussDB | 41209.88 | 1638.43 |
TDSQL-C | 40414.65 | 1559.45 |
从我对五款数据库进行I/O密集型压测结果的综合对比可以看出,无论是在oltp_read_only模式、oltp_read_write模式,还是在oltp_write_only模式下,PolarDB的性能都是最优的。
64C512GB规格综合对比
为了更加直观的对比每款数据库在64C512GB规格下的性能,这里我将在64C512GB规格下的压测结果数据进行整合对比,如下所示。
计算密集型压测结果对比
(1)oltp_read_only模式压测对比
数据库 | 300线程QPS | 1线程QPS |
PolarDB | 583481.91 | 5299.95 |
OceanBase | 210599.67 | 1979.00 |
Aurora | 460661.52 | 3953.16 |
GaussDB | 324943.02 | 5238.16 |
TDSQL-C | 345769.06 | 4102.13 |
(2)oltp_read_write模式压测对比
数据库 | 300线程QPS | 1线程QPS |
PolarDB | 459306.28 | 4998.68 |
OceanBase | 161787.02 | 1725.00 |
Aurora | 161193.67 | 2330.50 |
GaussDB | 231511.89 | 3528.90 |
TDSQL-C | 259070.85 | 2648.34 |
(3)oltp_write_only模式压测对比
数据库 | 300线程QPS | 1线程QPS |
PolarDB | 415477.31 | 5025.55 |
OceanBase | 102735.32 | 1636.21 |
Aurora | 52484.71 | 1282.10 |
GaussDB | 195454.50 | 2077.85 |
TDSQL-C | 122732.32 | 1799.2725 |
从我对五款数据库进行计算密集型压测结果的综合对比可以看出,无论是在oltp_read_only模式,还是在oltp_read_write模式,亦或是在oltp_write_only模式下,PolarDB的性能都是最好的。
I/O密集型压测结果对比
(1)oltp_read_only模式压测对比
数据库 | 300线程QPS | 1线程QPS |
PolarDB | 379448.39 | 3205.95 |
OceanBase | 186231.85 | 1663.59 |
Aurora | 162073.88 | 908.75 |
GaussDB | 202102.54 | 2438.24 |
TDSQL-C | 130938.23 | 2203.23 |
(2)oltp_read_write模式压测对比
数据库 | 300线程QPS | 1线程QPS |
PolarDB | 323182.93 | 3147.55 |
OceanBase | 142723.88 | 1592.08 |
Aurora | 75080.03 | 807.78 |
GaussDB | 164403.19 | 2243.14 |
TDSQL-C | 112711.66 | 1782.34 |
(3)oltp_write_only模式压测对比
数据库 | 300线程QPS | 1线程QPS |
PolarDB | 335549.53 | 3751.35 |
OceanBase | 99543.00 | 1447.24 |
Aurora | 26616.15 | 748.74 |
GaussDB | 152426.14 | 2254.31 |
TDSQL-C | 72023.23 | 1582.23 |
在大规格实例I/O密集型压测中,同样是PolarDB的测试性能最优,并且相对其他产品的优势比小规格实例更为明显。
以下是详细的PolarDB、OceanBase、Aurora、GaussDB和TDSQL-C 测试结果.
压测结果
在压测环境和压测配置都严格一致的情况下,我们开始对PolarDB、OceanBase、Aurora、GaussDB和TDSQL-C数据库分别进行压测。我对最终压测得出的结果数据进行了整理,下面分别按照8C64GB和64C512GB的规格给出测试结果。
8C64GB规格测试结果
PolarDB压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 128 | 1 | 95863.56 | 5184.38 |
oltp_read_write | 10 | 10000000 | 128 | 1 | 82701.53 | 4809.97 |
oltp_write_only | 10 | 10000000 | 128 | 1 | 96784.14 | 4617.05 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 40000000 | 128 | 1 | 67105.08 | 2943.15 |
oltp_read_write | 10 | 40000000 | 128 | 1 | 61093.90 | 2891.23 |
oltp_write_only | 10 | 40000000 | 128 | 1 | 61438.08 | 2602.82 |
OceanBase压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 128 | 1 | 61068.59 | 1953.32 |
oltp_read_write | 10 | 10000000 | 128 | 1 | 39874.51 | 1801.23 |
oltp_write_only | 10 | 10000000 | 128 | 1 | 31767.13 | 1648.32 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 40000000 | 128 | 1 | 33997.1 | 1684.21 |
oltp_read_write | 10 | 40000000 | 128 | 1 | 29325.76 | 1582.34 |
oltp_write_only | 10 | 40000000 | 128 | 1 | 29876.21 | 1503.22 |
Aurora压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 128 | 1 | 69933.45 | 3183.13 |
oltp_read_write | 10 | 10000000 | 128 | 1 | 42649.67 | 2465.01 |
oltp_write_only | 10 | 10000000 | 128 | 1 | 35598.10 | 1484.75 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 40000000 | 128 | 1 | 30695.90 | 1056.77 |
oltp_read_write | 10 | 40000000 | 128 | 1 | 21751.73 | 683.03 |
oltp_write_only | 10 | 40000000 | 128 | 1 | 23290.39 | 1001.32 |
GaussDB压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 128 | 1 | 85244.76 | 5638.32 |
oltp_read_write | 10 | 10000000 | 128 | 1 | 58522.77 | 4896.80 |
oltp_write_only | 10 | 10000000 | 128 | 1 | 58697.92 | 2216.81 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 40000000 | 128 | 1 | 24423.91 | 1927.34 |
oltp_read_write | 10 | 40000000 | 128 | 1 | 23178.85 | 1703.34 |
oltp_write_only | 10 | 40000000 | 128 | 1 | 41209.88 | 1638.43 |
TDSQL-C压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 128 | 1 | 94343.16 | 4091.835 |
oltp_read_write | 10 | 10000000 | 128 | 1 | 61997.33 | 2661.6075 |
oltp_write_only | 10 | 10000000 | 128 | 1 | 53867.95 | 1799.2725 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 128线程QPS | 1线程QPS |
oltp_read_only | 10 | 40000000 | 128 | 1 | 48069.14 | 2032.22 |
oltp_read_write | 10 | 40000000 | 128 | 1 | 38388.89 | 1667.94 |
oltp_write_only | 10 | 40000000 | 128 | 1 | 40414.65 | 1559.45 |
64C512GB规格测试结果
PolarDB压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 300 | 1 | 583481.91 | 5299.95 |
oltp_read_write | 10 | 10000000 | 300 | 1 | 459306.28 | 4998.68 |
oltp_write_only | 10 | 10000000 | 300 | 1 | 415477.31 | 5025.55 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 300000000 | 300 | 1 | 379448.39 | 3205.95 |
oltp_read_write | 10 | 300000000 | 300 | 1 | 323182.93 | 3147.55 |
oltp_write_only | 10 | 300000000 | 300 | 1 | 335549.53 | 3751.35 |
OceanBase压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 300 | 1 | 210599.67 | 1979.00 |
oltp_read_write | 10 | 10000000 | 300 | 1 | 161787.02 | 1725.00 |
oltp_write_only | 10 | 10000000 | 300 | 1 | 102735.32 | 1636.21 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 300000000 | 30 | 1 | 186231.85 | 1663.59 |
oltp_read_write | 10 | 300000000 | 30 | 1 | 142723.88 | 1592.08 |
oltp_write_only | 10 | 300000000 | 30 | 1 | 99543.00 | 1447.24 |
Aurora压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 300 | 1 | 460661.52 | 3953.16 |
oltp_read_write | 10 | 10000000 | 300 | 1 | 161193.67 | 2330.50 |
oltp_write_only | 10 | 10000000 | 300 | 1 | 52484.71 | 1282.10 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 300000000 | 300 | 1 | 162073.88 | 908.75 |
oltp_read_write | 10 | 300000000 | 300 | 1 | 75080.03 | 807.78 |
oltp_write_only | 10 | 300000000 | 300 | 1 | 26616.15 | 748.74 |
GaussDB压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 300 | 1 | 324943.02 | 5238.16 |
oltp_read_write | 10 | 10000000 | 300 | 1 | 231511.89 | 3528.90 |
oltp_write_only | 10 | 10000000 | 300 | 1 | 195454.50 | 2077.85 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 300000000 | 300 | 1 | 202102.54 | 2438.24 |
oltp_read_write | 10 | 300000000 | 300 | 1 | 164403.19 | 2243.14 |
oltp_write_only | 10 | 300000000 | 300 | 1 | 152426.14 | 2254.31 |
TDSQL-C压测结果
(1)计算密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 10000000 | 300 | 1 | 345769.06 | 4102.13 |
oltp_read_write | 10 | 10000000 | 300 | 1 | 259070.85 | 2648.34 |
oltp_write_only | 10 | 10000000 | 300 | 1 | 122732.32 | 1799.2725 |
(2)I/O密集型压测结果
读写模式 | 表数目 | 表大小 | 最大线程数 | 最小线程数 | 300线程QPS | 1线程QPS |
oltp_read_only | 10 | 300000000 | 300 | 1 | 130938.23 | 2203.23 |
oltp_read_write | 10 | 300000000 | 300 | 1 | 112711.66 | 1782.34 |
oltp_write_only | 10 | 300000000 | 300 | 1 | 72023.23 | 1582.23 |
最后,希望这次对于云原生数据库的压测结果能够为大家选型云原生数据库时提供一点点帮助。