目前公司使用的关系型数据库版本较老,有计划对关系型数据库进行一次升级。有两个方案,一是将现在的mysql5.7升级到8.0,二是将数据库替换成pgsql15,所以对这两个库的查询写入和资源损耗进行一次对比。
前置准备
服务器
两台配置相同的服务器。配置参数如下:
CPU:
内存:32GB
磁盘:
网络:千兆网络
数据库版本
MySQL 8
PostgreSQL 15
程序
使用 springboot
+ mybatis-plus
框架进行数据插入和查询。部分代码如下:
数据插入:
@Testpublic 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<Long> group = new ArrayList<>();for (long i = 0; i < 1000000; i += 1000) {group.add(i);}group.stream().parallel().forEach(num -> {long point = num + 1000;List<Analysis> 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());}
数据查询:
@Testpublic void test002() {Page<Analysis> page = new Page<>(1, 1000000);Page<Analysis> 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。