是時候使用MySQL 8了!

dt時代 發佈 2024-04-28T23:06:12.845699+00:00

了解資料庫技術發展的同學知道,資料庫有個重要的發展方向就是和硬體緊密集成,把一些軟體乾的活「下放」給硬體去做,能極大地提升性能。比如TeraData的大數據一體機,在硬體,作業系統,存儲等方面專門為數據分析做了優化,性能自然強大。

了解資料庫技術發展的同學知道,資料庫有個重要的發展方向就是和硬體緊密集成,把一些軟體乾的活「下放」給硬體去做,能極大地提升性能。

比如TeraData的大數據一體機,在硬體,作業系統,存儲等方面專門為數據分析做了優化,性能自然強大。不過這些硬體提供的加速能力不是通用的服務,必須得單獨購買才行。

最近看到亞馬遜雲科技在2022年11月的re:Invent上發布了兩個雲資料庫的功能,一個是「優化寫入」,一個是「優化讀取」,發現它們就是利用Amazon Nitro系統,和底層硬體做了集成,讓mysql的寫入性能提升了2倍,讀取性能提升了50%。

優化寫入解決的是MySQL用軟體實現的Double Write Buffer的問題, 說的是MySQL緩衝區的數據頁是16 Kb,文件系統的頁通常是4 Kb,它們兩個不匹配。

當MySQL緩衝區的16 Kb的頁需要寫入文件系統時,需要分4次才行,那自然會出現類似這樣的問題:寫了3次以後掉電了,那最後4 Kb的數據就丟失了。

MySQL的解決辦法很粗暴,在硬碟上開闢一個2M的文件緩衝區,內存中緩衝區的數據在寫入真正的數據文件之前,先寫入這個文件緩衝區,寫成功了,再往真正的數據文件去寫。


這樣再出現寫入12 Kb就斷電,真正的數據文件中雖然還是有4Kb是丟失的,但是可以從那個2M的文件緩衝區找到原始數據進行恢復,因為那裡寫成功了,是完整的。

由於需要往硬碟寫入兩次,所以叫做Double Write,這個辦法雖然可以工作,但是說實話,挺彆扭的,因為斷電這種極端情況很罕見,絕大部分時間這個2M的文件緩衝區沒用,白白多寫了一次硬碟,要知道硬碟速度可比內存訪問慢多了。

我們很容易就會想到:就不能把MySQL緩衝區的16 Kb數據一次性地寫入硬碟嗎?這樣不就省事了嗎?

通過使用Amazon Nitro系統中的Torn Write Prevention技術,亞馬遜雲資料庫實現了優化寫入數據,只需一步即可安全寫入 16Kb 數據頁,完全不用複雜的Double Write了。

簡潔的系統必然帶來更高的效率,優化寫入讓寫入事務吞吐量提高多達 2 倍,且無需額外費用,非常適合寫入密集型應用,比如數字支付,金融交易,在線遊戲等等。

這就是軟體和硬體結合帶來的威力。

有了優化寫入,自然有對應的「優化讀取」

在雲資料庫中,計算節點和存儲節點一般是分離的。我們在做數據分析的時候經常需要很複雜的查詢,涉及的數據會有上千萬條,還需要分組,計算,排序等,這時候MySQL就會形成臨時對象,當臨時對象大到一定程度,就需要形成臨時的表空間,移到硬碟上來存儲了。

上圖中,Amazon RDS實例是計算節點,Amazon Elastic Block Store(Amazon EBS)是存儲節點,這個臨時的表空間(上圖紅框所示)是存儲在Amazon EBS上,由於是分布式的存儲,訪問就會有一定的延遲。

現在通過軟硬一體化,在Amazon RDS實例上掛載一張NVMe的SSD存儲,它針對低延遲、高隨機 I/O 性能和高順序讀取吞吐量進行了優化。

在軟體層面,讓臨時表空間轉移到這個SSD存儲卡中,計算節點直接訪問本地存儲,這速度立刻飛起。

對於複雜查詢,「優化讀取」的加速效應非常明顯,可以提升50%, 查詢越大越複雜,優化效果越好。

我到亞馬遜雲科技的網站上去看了一下,想要開啟「優化寫入」和「優化讀取」,充分發揮底層硬體的功能,需要RDS MySQL 8及以上的版本

這也很正常,MySQL 8.0 2018年4月19日正式GA ,已經發布了快5年了,疊代了30多個版本! 功能已經非常穩定了。

MySQL 8.0性能強勁,全內存訪問可以輕易跑到200萬QPS,I/O極端高負載場景跑到16萬QPS。和MySQL 5.7 相比,benchmark性能提升明顯:

(MySQL 8.0 Sysbench Benchmark: IO Bound Read Only)

(MySQL 8.0 Sysbench Benchmark: Read Write)

MySQL 8.0還有一些非常好的新功能,這裡挑幾個重要說一下:

1、默認字符集為 utf8mb4

多少年來我們使用 MySQL 都要在編碼方面小心翼翼,生怕忘了將預設的 latin 改掉而出現亂碼問題,現在終於不用擔心了,從 MySQL 8 開始,資料庫的預設編碼將改為 utf8mb4,這個編碼包含了所有 emoji 字符,對移動端應用非常友好。


2、優化器增強

MySQL8.0開始支持隱藏索引和降序索引,隱藏索引對性能調優非常有用,當一個索引被隱藏時,它不會被查詢優化器所使用。


我們可以隱藏一個索引,然後看看資料庫的性能,如果資料庫性能沒啥變化,說明索引是多餘的,可以刪除;如果性能下降,那證明這個索引是有用的,一定要保留(把它恢復顯示即可)


降序索引允許優化器對多個列進行排序,並且允許排序順序不一致。


3、更完善的JSON支持

擴展了JSON語法,提供了聚集函數,Merge函數,改善了排序性能,支持部分更新。


還新增了JSON_TABLE()函數,可以將JSON數據轉換成表。


4、GIS的提升

MySQL 8.0 對 GIS(譯者註:Geographic Information System 地理信息系統) 的支持有非常高的提升,功能上直追 PostgreSQL。


5、公共表表達式

MySQL 8.0新增了CTEs 功能(Common Table Expresssions)。這是一個命名的臨時結果集,僅在單個 SQL 語句的執行範圍內存在,可以是自引用,也可以在同一查詢中多次引用。


6、窗口函數

窗口函數有點像是 SUM()、COUNT() 那樣的集合函數,但它並不會將多行查詢結果合併為一行,而是將結果放回多行當中,它可以極大地降低代碼複雜性並幫助開發人員提高工作效率。


7、DDL原子化

DDL原子化是將與DDL操作相關的數據字典更新、存儲引擎操作、二進位日誌寫入結合到一個單獨的原子事務中,這使得即使伺服器崩潰,事務也會提交或回滾。使用支持原子操作的存儲引擎所創建的表,在執行DROP TABLE、CREATE TABLE、ALTER TABLE、 RENAME TABLE、TRUNCATE TABLE、CREATE TABLESPACE、DROP TABLESPACE等操作時,都支持原子操 作,即事務要麼完全操作成功,要麼失敗後回滾


8、安全和帳戶管理

MySQL 8.0 開始支持「角色」的概念,角色是權限的集合,用戶如果被賦予了某個角色,就會擁有相關的權限。


MySQL 8.0中的用戶相關的系統表使用了支持事務的InnoDB引擎(之前是MyISAM),這樣在對用戶進行操作時,就不會出現部分用戶成功,部分用戶失敗的情況。


MySQL 8.0把caching_sha2_password作為默認的身份驗證插件而不是之前版本的mysql_native_password,提供了更高的安全性。


9、數據字典

在之前的MySQL版本中,字典數據都存儲在元數據文件和非事務表中。從MySQL 8.0開始新增了事務數據字典,在這個字典里存儲著資料庫對象信息。


類似的新功能還有很多, MySQL 8.0不僅在性能上做了巨大提升,在功能上也更加完善,MySQL 8.0已經被國內外眾多公司使用,最終是要大面積替代MySQL5.7的。如果你在用低版本的MySQL,建議升級到MySQL 8.0 ,對於新應用,直接上MySQL 8吧!

關鍵字: