MySQL 8.0.35 企業版比社區版性能高出 25%?

前言

說實話,比較一下這兩個 MySQL 發行版,並不會讓我很興奮。這是因爲在我關於 MySQL 的記憶中,如果是談代碼庫時,兩個發行版之間沒有真正的區別。

據我所知,企業版的差異在於附加的插件/組件,因此除非您明確需要使用它們,否則兩個版本應該是相同或接近的。

那麼你可能會說,爲什麼要寫這篇文章?😉

好吧,在一篇 Oracle 的博客及其開場白 戳中了這一點:MySQL 8.0.35 的企業版與社區版相比,性能方面是有所提高的。

以下是該文章的部分結果截圖:

企業版在所有測試的線程配置中平均增益爲 24%。

企業版在所有測試的線程配置中平均增益爲 34%。

企業版在所有測試的線程配置中平均增益爲 26%。

企業版在所有測試的線程配置中平均增益爲 21%。

根據顯示的結果來看,讓我特別想進一步測試一下,但服務器的配置方式有點麻煩。

在博客的測試中,測試數據庫總大小爲 20 GB,相應的 InnoDB 緩衝池爲 124 GB,其他設置與默認值不同,如 innodb_undo_log_truncate=FALSE

簡而言之,這意味着所有工作都在內存中完成,一旦加載數據,磁盤上的任何操作都會減少。設置是爲了滿足測試基準,而不是基於定製或通用默認值的實際生產而準備。

同樣令我感動的是,該文章報告 企業版的性能提高了 17% 到 25%

25% 的增長是很多了。難道不值得驗證一下嗎?當然,是的,我接下來就是這麼做的。

測試環境準備

不測 Oracle,因此我的測試基於一個配置較差的 EC2 實例:m5.xlarge 4 個 CPU、16GB RAM。

我還使用提供的卷作爲 MySQL 數據目錄的位置,而用於在測試運行之間重置數據的離線數據集位於額外的塊存儲上。

應用程序節點位於同一網絡/子網/區域中,並且也是 m5.xlarge 規格。 沒有代理或中間件。

MySQL 企業版社區版 的配置主要基於默認值,但以下內容除外:

[mysqld]
basedir                                                     =/opt/mysql_templates/mysql-8P/
datadir = /opt/mysql_instances/test-sysbench-my834/data
lc_messages_dir                                             =/opt/mysql_templates/mysql-8P/share/
log-error = /opt/mysql_instances/test-sysbench-my834/mysql-3307.err
pid-file = /opt/mysql_instances/test-sysbench-my834/mysqld.pid
plugin-dir                                                  =/opt/mysql_templates/mysql-8P/lib/plugin/
port = 3307
server-id = 3307
socket = /opt/mysql_instances/test-sysbench-my834/mysql.sock
tmpdir = /opt/mysql_instances/test-sysbench-my834/temp
user                                                        =mysql
default_time_zone='+01:00'
max-connections                                             =2500
innodb-buffer-pool-instances                                =3
innodb-buffer-pool-size                                     =10G
innodb-data-file-path                                       =ibdata1:100M:autoextend
innodb_data_home_dir = /opt/mysql_instances/test-sysbench-my834/data
innodb_redo_log_capacity                                    =3355443200
innodb_log_group_home_dir = /opt/mysql_instances/test-sysbench-my834/logs
skip-log-bin

簡而言之,禁用 binlog,將 redo log 設置爲實際的值。當然,將緩衝池設置爲適合 RAM 但不適合數據集的維度。所有其他參數都是指向 日誌/二進制文件/庫 的指針。

配置差異是:

:comparing_MYSQL_8_2_Comunity_VS_enterprise marcotusa$ diff mysql_8_2_community_configuration.txt mysql_8_2_enterprise_configuration.txt 
22c22
< basedir	/opt/mysql_templates/mysql-8.2.0-linux-glibc2.17-x86_64/
---
> basedir	/opt/mysql_templates/mysql-commercial-8.2.0-linux-glibc2.17-x86_64/
50c50
< build_id	c935957ee1349a3974baf2ff5568243a6ebbcd18
---
> build_id	c0de3cc4e369f54b5ab004d8731a7d7040597452
63c63
< character_sets_dir	/opt/mysql_templates/mysql-8.2.0-linux-glibc2.17-x86_64/share/charsets/
---
> character_sets_dir	/opt/mysql_templates/mysql-commercial-8.2.0-linux-glibc2.17-x86_64/share/charsets/
301c301
< license	GPL
---
> license	Commercial
629,630c629,630
< version	8.2.0
< version_comment	MySQL Community Server - GPL
---
> version	8.2.0-commercial
> version_comment	MySQL Enterprise Server - Commercial

測試過程

測試工具是 sysbench,以下是測試計劃。

正如計劃中所表達的,我們將使用兩個不同的數據集,一個使用更多的表和每個表更少的數據,另一個使用每個表更多的數據和更少的表。在這兩種情況下,數據集維度都遠遠大於可用內存。

正如上面博客中提到的,我們將在三個時刻進行測試:

  1. 只讀。這也是一個 Pre 操作,它將在數據加載後爲我們提供 READ 統計信息,因此完全內部排序。
  2. 寫操作,可能會導致(並且將會)頁面拆分/合併和“碎片”。
  3. 讀取後寫入以確定第二個時刻的影響。

我使用 MySQL 8.2 作爲測試版本,因爲如果代碼中推送了任何更改,該版本應該包含。

好的,是時候運行測試了。我們開始做吧!

測試結果

我知道我剝奪了所有的樂趣和懸念,但我們必須從這裏開始。

Sysbench

TPCc

什麼?在大多數測試中,MySQL 社區版的表現是最好的,而不是企業版。爲何如此? 好吧,讓我們開始深入挖掘並更好地瞭解這裏發生了什麼。

Sysbench 詳解

以下是閱讀下面圖像的方法:

  • 綠色正值表示企業版表現更好;算作 +1。
  • 紅色負值意味着社區版做得更好;算作 -1。
  • 空白處帶 0 的不計算在內。

需要按列讀取,只有在企業版優於社區版 50% 以上的情況下,結果纔會是綠色。

現在,正如我們所看到的,企業版只希望在數據加載後並且僅當負載分佈在更多表上時才能做得更好。我已經能聽到噪音了…… 請耐心等待,一切很快就會清楚。

此外,對於寫入而言,只有當負載分佈在多個表上時,企業版似乎才能做得更好,而在其他情況下社區版更好。

TPC-c 詳解

對於類似 TPC-c 的測試,我使用不同的隔離級別運行了兩組測試:

  • 使用可重複讀 (RR)
  • 使用讀已提交 (RC)

在這方面,MySQL 企業版從來沒有比社區版更好。

讓我們挖掘一下!

真正的差異是什麼?兩者有什麼區別?爲了回答這個問題,我將在這裏通過測試展示讀取和寫入圖表。

在向您展示測試結果時,我不會對其進行評論。我堅信圖像會說話,在這種情況下,如果 100% 真實,我只會在最後發表評論。

讀操作

select_run_list

select_run_inlist_hotspot

select_run_point_select

select_run_range_all

select_run_range_distinct

select_run_range_order

select_run_range_simple

select_run_range_sum

select_run_select_scan

寫入

對於寫入,我將在本文僅顯示累積測試,但您可以在給定的 GitHub 鏈接 中查看每個測試的圖表。

write_run_write_all_with_trx

write_run_write_all_no_trx

TPC-c

如果你到了這一步,你自己應該已經明白了。

圖表顯示,這兩種解決方案几乎是相同的,每當社區版或企業版有一個小的優勢時,它只是線程數量的暫時性優勢,因此微乎其微,無關緊要。

結論

正如所懷疑的,如果您使用普通配置/場景使用默認值來測試社區版和企業版,那麼 MySQL 社區版和 MySQL 企業版之間的性能沒有差異。

一些額外的組件會導致功能或性能的改進,例如線程池。

因此,除非 Oracle 使用與註冊用戶可用的版本不同的企業版,否則我真的不知道如何才能通過簡單配置在企業版中獲得 25% 的性能提升。

目前爲止,我沒有看到性能的顯著變化。我希望 Oracle 公司繼續做它迄今爲止所做的事情,使用附加組件而不是閉源模式的核心來增強企業版本。

更多技術文章,請訪問:https://opensource.actionsky.com/

關於 SQLE

SQLE 是一款全方位的 SQL 質量管理平臺,覆蓋開發至生產環境的 SQL 審覈和管理。支持主流的開源、商業、國產數據庫,爲開發和運維提供流程自動化能力,提升上線效率,提高數據質量。

SQLE 獲取

類型 地址
版本庫 https://github.com/actiontech/sqle
文檔 https://actiontech.github.io/sqle-docs/
發佈信息 https://github.com/actiontech/sqle/releases
數據審覈插件開發文檔 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章