天天看點

MySQL的未來在哪?MySQL的過去MySQL的現狀MySQL的未來

阿裡雲 MySQL&MariaDB 資料庫産品結合開源社群,提供了穩定、可靠、便捷、彈性的線上資料庫服務,幫助全球企業客戶進行數字化轉型。MySQL發展經曆了一系列變化,從Sun到Oracle,發展也經過了幾個階段。MySQL從5.7版本開始走上了代碼重構之路,這為MySQL未來10年的發展奠定了堅實基礎,而未來MySQL将和雲計算碰撞出什麼樣的火花?本文中,阿裡雲研究員呂漫漪将為大家分享MySQL的前世今生。

MySQL的未來在哪?MySQL的過去MySQL的現狀MySQL的未來

MySQL的過去

對于MySQL而言,其最大的發展變化就是被Sun收購,但是Sun原本就有資料庫團隊,MySQL被收購之後兩個團隊也合并了起來。MySQL的團隊懂得社群并且有激情,而Sun的團隊懂得怎樣軟體工程化,懂得保證品質和産品疊代,是以團隊合并之後對于MySQL的改變很大。在這之後Sun被Oracle收購,這又是另外一個轉折點,Oracle不僅給了MySQL團隊很大自由,也投入了很多人力和物力。這也保證了2013、2015以及2018年,每間隔2年多的時間就能推出一個較為成熟的新版本,而在2018年之後其疊代周期就會迅速變短,因為朝着物聯網方向發展,大概每三個月就會疊代一次。

近十年中,Oracle做了很多很好的事情,其中有一點事情雖然很少談到,但是對于之後的發展卻極為重要,那就是——代碼重構。大家都希望完善功能,提高性能,但是很少有人做了代碼重構。所謂代碼重構就是在不改變功能的前提下,改善代碼結構,提高可讀性和可擴充性。這件事情雖然說起來簡單,但是做起來難,特别是在進行決策的時候。MySQL5.6版本的時候決定進行代碼重構,這是因為,Oracle增加了很多人力進入MySQL項目,但是當時的系統卻存在很多Bug,這使得代碼維護變得極為困難,使很多人力用于維護舊代碼而不是增加新功能。此外,還使新功能的開發周期變得特别長,并且容易發生錯誤。當然,因為有很多錯誤,并且代碼沒有注釋和文檔,使新人接手項目變得困難。

MySQL的現狀

是以為了保證長期的市場領先地位,MySQL必須要進行代碼重構。在最開始,主要是将解析、優化、查詢等步驟進行拆分,友善找到存在問題的子產品。此外, 還實作了一些工具,來幫助檢測Bug。MySQL5.7中的優化器部分,30%的代碼是重寫的,而在8.0中解析器的50%都是重寫的,可見投入很大。MySQL将程式設計語言都統一到C++,編譯器都使用最新版本,代碼規格采用谷歌的,統一了300人的開發團隊的代碼标準。代碼重構這件事情可能是對于未來10年的MySQL發展所做的最重要的一件事情。這是因為有了高品質的代碼,才能夠快速推出新的功能,降低維護成本,使得新人更快上手項目。

解析器在重構之前的結構就像是一盤意大利面,非常混亂,重構之後就變得極為清晰。當重構完解析器之後發現,以前很多解析器的Bug都消失了,此外,增加複雜文法的效率也得到了極大的提升,節約了大量時間。此外,還做了多核性能提高,這也是硬體的趨勢,雖然每個核心不會更快,但是數目卻會增加。在重構之後,讀性能提高了三倍,寫的性能也有很可觀的的提高。

MySQL另外一個大的改變就是測試方面,如今的使用者更多的是企業級使用者,他們更多關注于更高的穩定性。對于資料庫而言,最重要的永遠都是穩定性,功能和性能是其次的。對于測試方法而言,要求對于新的功能,測試代碼覆寫率達到95%,所有的開發人員在送出代碼的時候都要進行單元測試。在實作新功能的時候,需要開發和測試同時進行,整體測試之後才能将代碼推入主幹,性能測試,每天都會測試,此外有重大更新推入主幹時需要進行完整的性能測試,保證性能不會退化。所有測試都自動化,不需要人為測試。

功能上的最大亮點就是在MySQL5.7版本中推出了JSON資料類型。雖然MySQL一直都是關系型資料庫,但是發現自己的使用者不僅僅需要關系型資料庫,也需要支援非結構化資料。是以MySQL需要和客戶自己成長,是以在5.7版本中加入了JSON資料類型,也推出了很多适于JSON的函數,是以使用者可以選擇使用類似于MongoDB的Document的API,使用者可以将MySQL當做NoSQL來使用,而不用關心底層的原理,而且還實作了NoSQL所無法比拟的功能。

MySQL5.7功能中的另外一個亮點是“Group Replication”。這還是因為了除了網際網路客戶已經普遍地應用MySQL了,還有很多新增客戶是企業級客戶,他們要求高可靠性。組複制就是提高可靠性的一個功能,支援自動切換和多寫,而多寫也提升了高可用性,而且支援多寫檢測。這個功能目前隻支援InnoDB,但很多新功能也支援InnoDB。

MySQL 8.0版本的新功能亮點就是自檢表,對于客戶而言做好的一點就是就是它支援原子操作的DDL,特别是在雲上原子性的DDL發揮了決定的作用,因為很多操作都是自動操作,不可能讓人手動修改DDL復原時發生的錯誤。這一點對于雲資料庫而言非常重要。

此外,MySQL 8.0版本還提升了Information Scheme的性能。而無論是系統表還是普通表,都存放在InnoDB裡面,是以其處理方式是一樣的。對于開發者而言,有了資料自檢,增加新的功能就會非常容易。

遞歸公用表表達式以及視窗函數都是非常複雜的SQL語句,在8.0中加入這兩個語句縮短了MySQL和Oracle的差距,這會大幅度地降低資料庫開發人員的開發時間。CTE主要用于對于存在層次等級的表中做遞歸的查詢,這一功能在報表中非常常用。視窗函數則是用在分析型工作中的,比如分析每年、每季度的營收等。這些就是在MySQL8.0中新增的針對于資料庫開發者的功能,幫助他們提升開發效率。

MySQL的未來

MySQL的未來其實隻有一個字,那就是“雲”。有預測稱“在2020年,83% 的企業負載會轉移到雲上”,也就是說大部分線下場景會轉移到雲上,這對于MySQL而言既是一個機會也是一個挑戰。MySQL需要在進行核心改動和優化,使其更适合在雲上發展。

雲上資料庫架構存在着明顯的轉變,最為明顯的就是計算層和存儲層的分離。計算層不共享,但是存儲層會變成共享存儲。共享存儲會達到雲規模,也就是極大規模,能夠支援所有使用者,這樣能夠極大地節約資源。而這樣的想法已經被PolarDB用到了。而企業級客戶需要高可靠性,是以雲上資料庫需要演變成為可以跨機房的高可靠性,而且需要保證切換的過程中不丢失任何資料。在雲上,很切換過程多操作需要自動化,需要保證AC之間的切換不丢失任何資料。雲上資料庫與傳統資料庫不同的是需要考慮到雲上其他的服務,如何将資料庫和備份、恢複、審計、安全以及監控等其他服務進行內建。

資源管理也是值得MySQL提升的部分,有些事務對于響應時間要求很高,這樣可以優先處理響應時間較高的任務,而降低其他事務的優先級。此外,當記憶體不夠的時候應該如何處理,不能使得服務當機。可以進行復原或者降低新的請求,來保證資料庫的穩定狀态。此外,還有想做的一件事情就是智能生成執行計劃。因為一個SQL進來之後,先解析做優化,産生執行計劃,這裡需要改進的是在執行計劃生成的時候需要考慮更多的事情,比如查詢的響應要求以及記憶體限制。對于查詢時間和空間的平衡需要客戶自己決定。而現在的執行計劃是由優化器自己決定的,在未來希望能夠智能地生成執行計劃。

回到企業級工作負載,其實MySQL用在網際網路業務中是非常多的,但是衆所周知網際網路業務的查詢往往比較簡單,而企業級使用者的查詢相當複雜。MySQL目前對于簡單資料庫查詢的性能非常好,在這一方面做了很多優化,而在複雜查詢方面還可以做極多的優化,比如開啟多個線程并行執行。同時可以在InnoDB層做更多的并行執行,比如Scan、條件過濾等,是以在複雜查詢方面有無限的提升空間。

MySQL目前隻用于OLTP,此外目前還以一個發展很快的趨勢就是線上分析。未來,MySQL可能會同時支援事務性處理也會同時支援線上分析。線上分析和資料倉庫不同,因為資料已經在手裡了,可以用同一份資料做更多的分析。對于使用者而言,所看到的就是一個資料庫,但是所能夠包含的功能确是難以想象的。

雙11狂歡,雲資料庫首購低至2折!還能100%中獎,最高1000元無門檻通用代金券,快來參加吧!>>