目前公司使用的关系型数据库版本较老,有计划对关系型数据库进行一次升级。有两个方案,一是将现在的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单表数据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。