MySQL效能基準測試對比:5.7 VS 8.0

qcloud發表於2019-03-07

本文由雲+社群發表

作者:資料庫

版權宣告:本文由騰訊雲資料庫產品團隊整理,頁面原始內容來自於severalnines英文官網,若轉載請註明出處。翻譯目的在於傳遞更多全球最新資料庫領域相關資訊,並不意味著騰訊雲資料庫產品團隊贊同其觀點或證實其內容的真實性。如果其他媒體、網站或其他任何形式的法律實體和個人使用,必須經過著作權人合法書面授權並自負全部法律責任。不得擅自使用騰訊雲資料庫團隊的名義進行轉載,或盜用騰訊雲資料庫團隊名義釋出資訊。

原文連結:https://severalnines.com/blog/mysql-performance-benchmarking-mysql-57-vs-mysql-80


在Oracle MySQL團隊的推動下,MySQL 8.0發生了巨大的變化和修改。

物理檔案已更改。例如,.frm, .TRG,.TRN和 .par 不再存在。新增了大量的新特性,如通用表表示式(Common Table Expressions CTE),視窗函式(Window Functions),不可見索引( Invisible Indexes),正規表示式(regexp) -MySQL8.0現在已經完全支援Unicode,且具有多位元組安全特性。資料字典也發生了變化。它現在與一個事務性資料字典合併,該字典儲存有關資料庫物件的資訊。與以前的版本不同,字典資料儲存在後設資料檔案和非事務表中。

安全性得到了改進,caching_sha2_password認證方式取代了之前的mysql_native_password認證方式,成為預設的身份驗證方式。它提供了更強大的靈活性,而且也加強了安全性,即它要求必須使用安全連線或通過RSA金鑰對實現的支援密碼交換的未加密連結。

有了MySQL 8.0提供的所有這些很出色的功能,以及進行的增強和改進,我們團隊很有興趣來了解下MySQL 8.0當前版本的效能情況。特別是考慮到我們針對MySQL 8.0.x設計的ClusterControl正在進行中(請繼續保持關注)。這篇博文不會討論MySQL8.0的特性,但打算將其效能與MySQL 5.7進行對比,看看它是如何改進的。

Server Setup and Environment伺服器設定和環境

對於此基準測試,我打算使用基於AWS EC2最小配置的系統環境:

· 例項型別:t2.xlarge例項

· 儲存:gp2(SSD儲存,最小100 IOPS,最大16000 IOPS)

· 虛擬CPU:4

· 記憶體:16GiB

· MySQL5.7版本:MySQLCommunity Server (GPL) 5.7.24

· MySQL8.0版本:MySQLCommunity Server - GPL 8.0.14

在這個基準測試中,我也針對一些引數項的取值進行了配置,它們是:

· innodb_max_dirty_pages_pct= 90 ##這是MySQL 8.0中的預設值。

· innodb_max_dirty_pages_pct_lwm= 10 ##這是MySQL 8.0中的預設值

· innodb_flush_neighbors=0

· innodb_buffer_pool_instances=8

· innodb_buffer_pool_size=8GiB

這裡對兩個版本(MySQL 5.7和MySQL 8.0)其餘引數項的配置是參照ClusterControl的my.cnf模板進行調優。

此外,我在這裡不使用MySQL8.0的新身份驗證方式,即caching_sha2_password認證方式。替代的是在這兩個版本中都使用mysql_native_password,外加配置innodb_dedicated_serve=OFF(預設值),因為innodb_dedicated_serve是MySQL 8.0的新特性。

為了簡化工作,我使用ClusterControl配置MySQL 5.7 Community version節點,然後把該節點從叢集中的剔除,使其成為一個單獨主機,並關閉叢集控制主機,使MySQL 5.7節點處於休眠狀態(不監控流量)。從技術上講,MySQL 5.7和MySQL8.0都是休眠節點,在節點上沒有活動連線通,因此它基本上是一個純粹的基準測試。

搜尋關注“騰訊雲資料庫”官方微信,立得10元騰訊雲無門檻代金券,體驗移動端一鍵管理資料庫,更有從初階到高階資料庫實戰教程等你來約!

Commands and Scripts Used使用的命令和指令碼

對於此任務,sysbench用於測試和負載模擬這兩個環境。以下測試中使用的命令和指令碼:

sb-prepare.sh #!/bin/bash host=$1#host192.168.10.110port=3306user='sysbench'password='MysqP@55w0rd'table_size=500000rate=20ps_mode='disable'sysbench/usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --threads=1--max-requests=0 --time=3600 --mysql-host=$host --mysql-user=$user--mysql-password=$password --mysql-port=$port --tables=10 --report-interval=1--skip-trx=on --table-size=$table_size --rate=$rate --db-ps-mode=$ps_modeprepare

sb-run.sh

#!/usr/bin/envbash2     host=$1port=3306user="sysbench"password="MysqP@55w0rd"table_size=100000tables=10rate=20ps_mode='disable'threads=1events=0time=5trx=100path=$PWD  counter=1   echo "thread,cpu" >${host}-cpu.csv   for i in 16 32 64 128 256 512 1024 2048; do  threads=$i  mysql -h $host -e"SHOW GLOBAL STATUS" >> $host-global-status.logtmpfile=$path/${host}-tmp${threads}touch $tmpfile/bin/bashcpu-checker.sh $tmpfile $host $threads &  /usr/share/sysbench/oltp_read_write.lua--db-driver=mysql --events=$events --threads=$threads --time=$time--mysql-host=$host --mysql-user=$user --mysql-password=$password--mysql-port=$port --report-interval=1 --skip-trx=on --tables=$tables--table-size=$table_size --rate=$rate --delete_inserts=$trx --order_ranges=$trx--range_selects=on --range-size=$trx --simple_ranges=$trx --db-ps-mode=$ps_mode--mysql-ignore-errors=all run | tee -a $host-sysbench.log   echo"${i},"`cat ${tmpfile} | sort -nr | head -1` >> ${host}-cpu.csvunlink ${tmpfile}   mysql -h $host -e"SHOW GLOBAL STATUS" >> $host-global-status.logdone   python $path/innodb-ops-parser.py $host  mysql -h $host -e "SHOW GLOBALVARIABLES" >> $host-global-vars.log

因此,指令碼只是準備sbtestschema並填充表和記錄。然後,它使用

/usr/share/sysbench/oltp_read_write.lua指令碼執行讀/寫負載測試。該指令碼轉儲全域性狀態和MySQL變數,收集CPU利用率,並解析由指令碼innodb-ops-parser.py處理的InnoDB行操作。指令碼根據基準測試期間收集的轉儲日誌生成 .csv檔案,我在這裡使用Excel電子表格從 .csv檔案生成圖表。請檢查 github中提交的程式碼。

現在,讓我們繼續處理圖表結果!

InnoDB行操作

img

img

img

img

基本上在這裡,我只提取了InnoDB行操作,它執行查詢(讀取),刪除,插入和更新。當執行緒數量增加時,MySQL 8.0明顯優於MySQL 5.7!在這兩個版本中都沒有針對配置項進行任何個性化變更,只有我統一配置的引數項。所以這兩個版本中的配置幾乎都使用預設值。

有趣的是,MySQL團隊關於新版本中讀寫效能的宣告,這些圖表指出了效能的顯著提高,特別是在高負載伺服器上。想一下MySQL 5.7和MySQL 8.0在InnoDB行操作上的區別,確實存在有很大的不同,特別是當執行緒數增加的時候。MySQL 8.0表明,無論工作負載如何,它都能高效地執行。

事務處理

img

img

如上圖所示,MySQL 8.0的結果趨勢顯示出其處理事務所需的時間的巨大變化。縱軸數值越低,代表效能越好,意味著處理事務的速度更快。處理的事務統計表(第二張表)還顯示出這兩個版本處理事務的數量沒有差異。這意味著,兩個版本處理的事務數量幾乎相同,但它們的完成速度不同。雖然MySQL 5.7在較低的負載下可以大量事務,但是實際的負載,特別是在生產中,可能會更高——尤其是在最繁忙的時期。

img

上面的圖仍然顯示的是兩個版本能夠處理的事務數量,只是將讀和寫分離開來。然而,圖中實際上是存在異常值,而我沒有將這些值包括在內,因為它們是這一小部分異常結果會扭曲圖形。

MySQL 8.0體現出一個很大的改進,特別是對於讀取。表現在寫操作的效率上,特別是對於高工作負載的伺服器。在8.0版本中,影響MySQL讀取效能的重要新增支援是:可以按降序(或正向索引掃描)建立索引的能力。以前的版本只有升序或反向索引掃描,如果需要降序,MySQL必須執行filesort(如果需要filesort,需要檢查max_length_for_sort_data的值)。當最有效的掃描順序混合某些列的升序和其他列的降序時,降序索引還使優化器可以使用多列索引。有關詳細資訊,請參見此處。

CPU資源

img

在此基準測試中,我決定測試一些硬體資源,尤其是CPU利用率。

讓我先解釋一下如何在基準測試中獲取CPU使用率。在對資料庫進行基準測試時,sysbench測試結果中不包括在此過程中使用的硬體資源的統計資訊。因此,我所做的是通過建立檔案的方式來建立標識,通過SSH連線到目標主機,然後用Linux命令“top”收集資料並在測試結束前進行解析,然後再次收集。然後分析出mysqld程式佔用最大的CPU使用量,最後刪除該標識檔案。你可以檢視我在github上的程式碼。

讓我們再次討論圖表結果,似乎表明MySQL 8.0消耗了大量的CPU,超過MySQL 5.7。然而,MySQL 8.0可能必須消耗額外的CPU在新的變數配置上。例如,這些變數可能會影響您的MySQL 8.0:

· innodb_log_spin_cpu_abs_lwm = 80

· innodb_log_spin_cpu_pct_hwm = 50

· innodb_log_wait_for_flush_spin_hwm = 400

· innodb_parallel_read_threads = 4

在此基準測試中,具有預設值的變數將保留其預設值。由於MySQL 8.0重新設計了InnoDB寫入REDO日誌的方式(這是一個改進),前三個變數可配置處理重做日誌的使用的CPU資源。例如,變數innodb_log_spin_cpu_pct_hwm具有CPU親和性,這意味著如果mysqld僅繫結到4個核心,它將忽略其他CPU核心。對於並行讀取執行緒,在MySQL 8.0中新增了一個新變數,您可以調整要使用的執行緒數。

然而,我沒有深入研究這個問題。可以通過利用MySQL8.0提供的特性來提高效能。

結論

MySQL 8.0中有許多改進。基準測試結果顯示,與MySQL 5.7相比,MySQL 8.0不僅在處理讀負載時,而且在讀寫混合的高負載下的效能都取得了令人矚目的進步。搜尋關注“騰訊雲資料庫”官方微信,立得10元騰訊雲無門檻代金券,體驗移動端一鍵管理資料庫,更有從初階到高階資料庫實戰教程等你來約!

再來看MySQL 8.0的新特性,看起來它不僅利用了最新的軟體技術(如Memcached的改進,遠端管理以獲得更好的DevOps工作效能等),還有硬體。例如,用UTF8MB4替換latin1作為預設字元編碼。這意味著它需要更多的磁碟空間,因為UTF8在非US-ASCII字元上需要2個位元組。雖然此基準測試沒有利用使用caching_sha2_password的新身份驗證方法,但它是否使用加密不會影響效能。一旦經過身份驗證,它就會儲存在快取中,這意味著身份驗證只進行一次。因此,如果您在客戶端只使用一個使用者,則不會出現問題,並且比以前的版本更安全。

由於MySQL利用最新的硬體和軟體,因此會更改其預設變數。你可以在這裡閱讀更多細節。

總的來說,MySQL 8.0的效能已經遠超過MySQL 5.7了。

此文已由騰訊雲+社群在各渠道釋出

獲取更多新鮮技術乾貨,可以關注我們騰訊雲技術社群-雲加社群官方號及知乎機構號

相關文章