pgsql/mysql/clickhouse性能对比

目前公司使用的关系型数据库版本较老,有计划对关系型数据库进行一次升级。有两个方案,一是将现在的mysql5.7升级到8.0,二是将数据库替换成pgsql15,所以对这两个库的查询写入和资源损耗进行一次对比。

前置准备

服务器

两台配置相同的服务器。配置参数如下:

CPU:

内存:32GB

磁盘:

网络:千兆网络

数据库版本

MySQL 8

PostgreSQL 15

程序

使用 springboot + mybatis-plus 框架进行数据插入和查询。部分代码如下:

数据插入:

     @Test
     public void test01() {
 
         String importer = "FEHMİ EROĞLU DIŞ TİCARET ANONİM ŞİRKETİ";
         String exporter = "MUNDIAL IMPORTAÇAO E EXPORTAÇAO EIRELI";
         String hsCode = "081310000000";
         String countryOfDestination = "brazil";
         String countryOfOrigin = "turkey";
         double weight = 40000.0000;
         double sumOfUSD = 263000.0000;
         double weightUnitPrice = 6.58;
         double qty = 0.0000;
         String qtyUnit = "KG";
 
         List group = new ArrayList<>();
         for (long i = 0; i < 1000000; i += 1000) {
             group.add(i);
        }
 
         group.stream().parallel().forEach(num -> {
             long point = num + 1000;
             List list = new ArrayList<>();
             for (long i = num; i < point; i++) {
                 Analysis analysis = Analysis.builder()
                        .date(new Date())
                        .importer(importer + (num + i))
                        .exporter(exporter + (num + i))
                        .hsCode(hsCode + (num + i))
                        .countryOfDestination(countryOfDestination + (num + i))
                        .countryOfOrigin(countryOfOrigin + (num + i))
                        .weight(BigDecimal.valueOf(weight + (num + i)))
                        .sumOfUSD(BigDecimal.valueOf(sumOfUSD + (num + i)))
                        .weightUnitPrice(BigDecimal.valueOf(weightUnitPrice + (num + i)))
                        .qty(BigDecimal.valueOf(qty + (num + i)))
                        .qtyUnit(qtyUnit + (num + i))
                        .build();
                 list.add(analysis);
            }
             analysisService.saveBatch(list);
        });
 
         System.out.println(analysisService.count());
    }

数据查询:

     
@Test
     public void test002() {
         Page page = new Page<>(1, 1000000);
         Page response = analysisService.page(page);
    }

性能对比

数据插入

上述程序均运行在同一台个人电脑(性能较差)上,共计插入数据 1000000 条。执行耗时如下:

MySQL PostgreSQL
第一次 5m22s 1m21s
第二次 5m37s 1m15s
第三次 5m20s 1m18s

结论:PostgreSQL插入性能约为MySQL的4倍

数据查询

上述程序均运行在同一台个人电脑(性能较差)上,执行耗时如下:

MySQL PostgreSQL
100w查10w 2s103ms 2s338ms
100w查20w 3s160ms 3s313ms
100w查30w 3s872ms 3s881ms
100w查40w 5s673ms 4s588ms
100w查50w 6s534ms 5s697ms
100w查100w 14s685ms 8s33ms
200w查10w 2s83ms 2s621ms
200w查20w 3s228ms 3s166ms
200w查30w 4s265ms 3s760ms
200w查40w 5s921ms 4s670ms
200w查50w 6s682ms 5s312ms
200w查100w 13s156ms 8s697ms
200w查200w 35s380ms 15s593ms
300w查10w 2s101ms 2s720ms
300w查50w 6s954ms 5s761ms
300w查100w 12s479ms 8s854ms
300w查200w 34s361ms 16s727ms
300w查300w OOM 23s128ms

服务器上查询对比mysql/pgsql/clickhouse性能对比

mysql和pgsql单表数据500W,clickhouse单表数据3000W,单条的数据长度相同,clickhouse服务器配置略高于mysql和pgsql

mysql  pgsql clickhouse
100万 3.9s 3.4s 1.1s
300万 11.1s 8.7s 2.2s
500万 19.7s 15.7s 4.3s
1千万 9.2s
3千万 21s

结论:大数据量单表查询场景,mysql、pgsql两个数据库的查询性能相较于clickhouse差别较大,与clickhouse不是一个级别的。

结论

单表50W以下mysql与pgsql相差较小,在10W级别甚至要优于pgsql。

超过50W数据量,mysql性能远不及pgsql。

clickhouse查询性能确实强悍,百万以下数据几乎都能在1S以内查出结果。

clickhouse对服务器配置要求较高,特别是cpu配置要求较高。 

最终决定将业务系统数据库替换成pg15。

你可能感兴趣的:(mysql,数据库)