本文由雲+社區發表javascript
做者:數據庫java
**版權聲明:**本文由騰訊雲數據庫產品團隊整理,頁面原始內容來自於severalnines英文官網,若轉載請註明出處。翻譯目的在於傳遞更多全球最新數據庫領域相關信息,並不意味着騰訊雲數據庫產品團隊贊同其觀點或證明其內容的真實性。若是其餘媒體、網站或其餘任何形式的法律實體和我的使用,必須通過著做權人合法書面受權並自負所有法律責任。不得擅自使用騰訊雲數據庫團隊的名義進行轉載,或盜用騰訊雲數據庫團隊名義發佈信息。python
原文連接:https://severalnines.com/blog/mysql-performance-benchmarking-mysql-57-vs-mysql-80mysql
物理文件已更改。例如,.frm, .TRG,.TRN和 .par 再也不存在。添加了大量的新特性,如通用表表達式(Common Table Expressions CTE),窗口函數(Window Functions),不可見索引( Invisible Indexes),正則表達式(regexp) -MySQL8.0如今已經徹底支持Unicode,且具備多字節安全特性。數據字典也發生了變化。它如今與一個事務性數據字典合併,該字典存儲有關數據庫對象的信息。與之前的版本不一樣,字典數據存儲在元數據文件和非事務表中。git
安全性獲得了改進,caching_sha2_password認證方式取代了以前的mysql_native_password認證方式,成爲默認的身份驗證方式。它提供了更強大的靈活性,並且也增強了安全性,即它要求必須使用安全鏈接或經過RSA密鑰對實現的支持密碼交換的未加密連接。github
有了MySQL 8.0提供的全部這些很出色的功能,以及進行的加強和改進,咱們團隊頗有興趣來了解下MySQL 8.0當前版本的性能狀況。特別是考慮到咱們針對MySQL 8.0.x設計的ClusterControl正在進行中(請繼續保持關注)。這篇博文不會討論MySQL8.0的特性,但打算將其性能與MySQL 5.7進行對比,看看它是如何改進的。正則表達式
Server Setup and Environment服務器設置和環境sql
對於此基準測試,我打算使用基於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行操做
基本上在這裏,我只提取了InnoDB行操做,它執行查找(讀取),刪除,插入和更新。當線程數量增長時,MySQL 8.0明顯優於MySQL 5.7!在這兩個版本中都沒有針對配置項進行任何個性化變動,只有我統一配置的參數項。因此這兩個版本中的配置幾乎都使用默認值。
有趣的是,MySQL團隊關於新版本中讀寫性能的聲明,這些圖表指出了性能的顯著提升,特別是在高負載服務器上。想一下MySQL 5.7和MySQL 8.0在InnoDB行操做上的區別,確實存在有很大的不一樣,特別是當線程數增長的時候。MySQL 8.0代表,不管工做負載如何,它都能高效地運行。
事務處理
如上圖所示,MySQL 8.0的結果趨勢顯示出其處理事務所需的時間的巨大變化。縱軸數值越低,表明性能越好,意味着處理事務的速度更快。處理的事務統計表(第二張表)還顯示出這兩個版本處理事務的數量沒有差別。這意味着,兩個版本處理的事務數量幾乎相同,但它們的完成速度不一樣。雖然MySQL 5.7在較低的負載下能夠大量事務,可是實際的負載,特別是在生產中,可能會更高——尤爲是在最繁忙的時期。
上面的圖仍然顯示的是兩個版本可以處理的事務數量,只是將讀和寫分離開來。然而,圖中其實是存在異常值,而我沒有將這些值包括在內,由於它們是這一小部分異常結果會扭曲圖形。
MySQL 8.0體現出一個很大的改進,特別是對於讀取。表如今寫操做的效率上,特別是對於高工做負載的服務器。在8.0版本中,影響MySQL讀取性能的重要新增支持是:能夠按降序(或正向索引掃描)建立索引的能力。之前的版本只有升序或反向索引掃描,若是須要降序,MySQL必須執行filesort(若是須要filesort,須要檢查max_length_for_sort_data的值)。當最有效的掃描順序混合某些列的升序和其餘列的降序時,降序索引還使優化器可使用多列索引。有關詳細信息,請參見此處。
CPU資源
在此基準測試中,我決定測試一些硬件資源,尤爲是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了。
此文已由騰訊雲+社區在各渠道發佈
獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號及知乎機構號