MySQL的將來在哪?

摘要: 阿里雲 MySQL&MariaDB 數據庫產品結合開源社區,提供了穩定、可靠、便捷、彈性的在線數據庫服務,幫助全球企業客戶進行數字化轉型。MySQL發展經歷了一系列變化,從Sun到Oracle,發展也通過了幾個階段。數據庫

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

MySQL的過去

對於MySQL而言,其最大的發展變化就是被Sun收購,可是Sun本來就有數據庫團隊,MySQL被收購以後兩個團隊也合併了起來。MySQL的團隊懂得社區而且有激情,而Sun的團隊懂得怎樣軟件工程化,懂得保證質量和產品迭代,所以團隊合併以後對於MySQL的改變很大。在這以後Sun被Oracle收購,這又是另一個轉折點,Oracle不只給了MySQL團隊很大自由,也投入了不少人力和物力。這也保證了201三、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可能會同時支持事務性處理也會同時支持在線分析。在線分析和數據倉庫不一樣,由於數據已經在手裏了,能夠用同一份數據作更多的分析。對於用戶而言,所看到的就是一個數據庫,可是所可以包含的功能確是不可思議的。

原文連接

相關文章
相關標籤/搜索