詳談MySQL和MariaDB區別與效能全面對比
MariaDB資料庫介紹
MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,採用GPL授權許可。開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險,因此社群採用分支的方式來避開這個風險。
MariaDB的目的是完全相容MySQL,包括API和命令列,使之能輕鬆成為MySQL的代替品。
MariaDB由MySQL的創始人麥克爾·維德紐斯主導開發,他早前曾以10億美元的價格,將自己建立的公司MySQL賣給了SUN,此後,隨著SUN被甲骨文收購,MySQL的所有權也落入Oracle的手中。
MariaDB名稱來自麥克爾·維德紐斯的女兒瑪麗亞(英語:Maria)的名字。
MariaDB直到5.5版本,均依照MySQL的版本。因此,使用MariaDB5.5的人會從MySQL5.5中瞭解到MariaDB的所有功能。從2012年11月12日起釋出的10.0.0版開始,不再依照MySQL的版號。10.0.x版以5.5版為基礎,加上移植自MySQL 5.6版的功能和自行開發的新功能。
在儲存引擎方面,10.0.9版起使用XtraDB(名稱代號為Aria)來代替MySQL的InnoDB。
MariaDB的API和協議相容MySQL,另外又添加了一些功能,以支援本地的非阻塞操作和進度報告。
這意味著,所有使用MySQL的聯結器、程式庫和應用程式也將可以在MariaDB下工作。
在此基礎上,由於擔心甲骨文MySQL的一個更加封閉的軟體專案,Fedora的計劃在Fedora 19中的以MariaDB取代MySQL
MariaDB和MySQL全面對比
誰在使用MySQL和MariaDB?
MySQL和MariaDB都發布了各自的使用者名稱單。
使用MySQL的有Facebook、Github、YouTube、Twitter、PayPal、諾基亞、Spotify、Netflix等。
使用MariaDB的有Redhat、DBS、Suse、Ubuntu、1&1、Ingenico等。
MariaDB和MySQL功能比較
有一些令人興奮的新功能(如視窗函式、角色控制或公共表表達式(CTE))可能值得一提,但本文只是為了比較兩個資料庫,所以我們在這裡只討論其中一方專門提供的功能,以便更好地幫助讀者選擇合適自己的資料庫。
讓我們來看一下只有其中一個數據庫專門提供的功能:
1. JSON資料型別
從5.7版本開始,MySQL支援由RFC 7159定義的原生JSON資料型別,可以高效地訪問JSON文件中的資料。
MariaDB沒有提供這一增強功能,認為JSON資料型別不是SQL標準的一部分。但為了支援從MySQL複製資料,MariaDB為JSON定義了一個別名,實際上就是一個LONGTEXT列。MariaDB聲稱兩者之間沒有顯著的效能差異,但他們並沒有提供基準測試資料來支援這個說法。
值得注意的是,MySQL和MariaDB都提供了一些JSON相關函式,用於更方便地訪問、解析和檢索JSON資料。
2. 預設身份認證
在MySQL 8.0中,預設的身份認證外掛是caching_sha2_password,而不是mysql_native_password。這一增強通過使用SHA-256演算法提高了安全性。
3. MySQL Shell
MySQL Shell是MySQL的高階命令列客戶端和程式碼編輯器。除了SQL之外,MySQL Shell還提供了JavaScript和Python指令碼功能。不過使用者不能使用mysqlsh訪問MariaDB伺服器,因為MariaDB不支援MySQL X協議。
4. 加密
MySQL對重做/撤消日誌進行了加密(可配),但不加密臨時表空間或二進位制日誌。相反,MariaDB支援二進位制日誌和臨時表加密。
5. 金鑰管理
MariaDB提供開箱即用的AWS金鑰管理外掛。MySQL也提供了一些用於金鑰管理的外掛,但它們僅在企業版中可用。
6. sys模式
MySQL 8.0提供了sys模式,這是一組物件,可幫助資料庫管理員和軟體工程師更好地理解通過Performance模式收集的資料。sys模式物件可用於優化和診斷,不過MariaDB沒有提供這個增強功能。
7. validate_password外掛
validate_password外掛主要用於測試密碼並提高安全性。MySQL預設啟用了這個外掛,而MariaDB則不啟用。
8. 超級只讀
MySQL通過提供超級只讀(super read-only)模式來增強read_only功能。如果啟用了read_only,伺服器只允許具有SUPER許可權的使用者執行客戶端更新。如果同時啟用了super_read_only,那麼伺服器將禁止具有SUPER許可權的使用者執行客戶端更新。
9. 不可見列
這個功能在MariaDB上可用,MySQL不支援該功能。這個功能允許建立未在SELECT *語句中出現的列,而在進行插入時,如果它們的名字沒有出現在INSERT語句中,就不需要為這些列提供值。
10. 執行緒池
MariaDB支援連線執行緒池,這對於短查詢和CPU密集型的工作負載(OLTP)來說非常有用。在MySQL的社群版本中,執行緒數是固定的,因而限制了這種靈活性。MySQL計劃在企業版中增加執行緒池功能。
MySQL和MariaDB效能
近年來,出現了很多關於MySQL和MariaDB引擎效能的基準測試。我們不認為“MySQL或MariaDB哪個更快”這個問題會有一個最終的答案,它在很大程度上取決於具體的使用場景、查詢、使用者和連線數量等因素。
不過,如果你確實想知道,下面列出了我們發現的一些最新的基準測試結果。請注意,這些測試都是在一組特定的資料庫+引擎(例如MySQL+InnoDB)組合上進行的,因此得出的結論只與特定的組合有關。
MySQL 8.0(InnoDB)和MariaDB 10.3.7(MyRocks)基準測試對比:
https://minervadb.com/index.php/2018/06/01/benchmarking-innodb-and-myrocks-performance-using-sysbench/
MariaDB 10.1和MySQL 5.7在商用硬體上的效能對比:
https://mariadb.org/maria-10-1-mysql-5-7-commodity-hardware/
MySQL 8.0和MariaDB 10.3.5效能對比及UTF8的影響:
http://dimitrik.free.fr/blog/archives/2018/04/mysql-performance-80-and-utf8-impact.html
複製功能
兩個資料庫都提供了將資料從一個伺服器複製到另一個伺服器的功能。它們的主要區別是大多數MariaDB版本允許你從MySQL複製資料,這意味著你可以輕鬆地將MySQL遷移到MariaDB。但反過來卻沒有那麼容易,因為大多數MySQL版本都不允許從MariaDB複製資料。
此外,值得注意的是,MySQL GTID不同於MariaDB GTID,所以將資料從MySQL複製到MariaDB後,GTID資料將相應地做出調整。
以下是這兩個資料庫在複製配置方面的一些差別:
MySQL的預設二進位制日誌格式是基於行的,而在MariaDB中,預設的二進位制日誌格式是混合式的。
log_bin_compress——這個配置決定了是否可以壓縮二進位制日誌。這個增強功能是MariaDB獨有的,因此MySQL不支援。
MySQL和MariaDB之間的不相容性
MariaDB的文件中列出了MySQL和MariaDB之間的數百個不相容問題。因此,我們無法通過簡單的方案在這兩個資料庫之間進行遷移。
大多數資料庫管理員都希望MariaDB只是作為MySQL的一個branch,這樣就可以輕鬆地在兩者之間進行遷移。但從最新發布的幾個版本來看,這種想法是不現實的。MariaDB實際上是MySQL的一個fork,這意味著在它們之間進行遷移需要考慮很多東西。
MySQL和MariaDB儲存引擎
MariaDB比MySQL支援更多的儲存引擎型別。但話說回來,資料庫可以支援多少個儲存引擎並不重要,重要的是哪個資料庫可以支援適合你需求的儲存引擎。
MariaDB支援的儲存引擎包括:
XtraDB、InnoDB、MariaDB ColumnStore、Aria、Archive、Blackhole、Cassandra Storage Engine、Connect、CSV、FederatedX、Memory、Merge、Mroonga、MyISAM、MyRocks、QQGraph、Sequence Storage Engine、SphinxSE、Spider、TokuDB
MySQL支援的儲存引擎包括:
InnoDB、MyISAM、Memory、CSV、Archive、Blackhole、Merge、Federated、Example
在Linux上安裝
當你在某些Linux發行版上安裝MySQL時,最後可能安裝的是MariaDB,因為它是很多(不是全部)Linux發行版的預設設定。
Red Hat Enterprise/CentOS/Fedora/Debian發行版預設會安裝MariaDB,而其他發行版(如Ubuntu)預設安裝MySQL。
雲平臺上的可用性
MariaDB可作為執行在Amazon Web Services(AWS)、微軟Azure和Rackspace Cloud上的服務。
MySQL在上面提到的三個平臺上也是可用的,同時還可以作為託管服務在谷歌雲服務平臺上執行。
因此,如果你正在使用谷歌雲平臺,並希望雲提供商為你管理服務,那麼可以考慮使用MySQL,除非你希望自己安裝和管理MariaDB例項。
MySQL和MariaDB許可
MariaDB採用了GPL v2許可,而MySQL提供了兩個許可選項——GPL v2(用於社群版)和企業許可。
MySQL的兩個許可之間的主要區別在於可用的功能和支援服務。使用者可以使用MariaDB的所有功能,但對於MySQL來說並非如此。MySQL的社群版不包含執行緒池等功能,而這些功能會對資料庫和查詢效能產生重大影響。
釋出頻率和更新
通常,MariaDB的釋出頻率比MySQL更頻繁。太高的釋出頻率既有利也有弊。從好的方面來說,使用者可以更及時地收到功能和錯誤修復。從不好的方面來說,為了讓MariaDB保持最新的狀態,需要更多的工作量。
技術支援
MySQL的支援團隊(包括MySQL開發人員和支援工程師)為客戶提供全天候服務。甲骨文提供了多種支援選項,包括擴充套件支援、持續支援和高階支援,具體取決於客戶的要求。MariaDB支援團隊的支援工程師包括了MariaDB和MySQL資料庫專家(因為很多功能最初是由MySQL團隊開發的),他們為生產系統提供全天候的企業級支援。
正在進行中的開發
MySQL的開發者主要是甲骨文的MySQL團隊,而MariaDB開發通過公開投票和郵件列表討論的方式進行。此外,任何人都可以向MariaDB提交補丁,MariaDB開發團隊會考慮將這些補丁新增到主程式碼庫中。因此,從某種程度上說,MariaDB是由社群開發的,而MySQL主要由甲骨文開發。
結論
好吧,我們無法為你做出決定。我們能做的就是有針對性地問你一些問題,然後你自己做出決定:
- 你是否分別基於這兩個資料庫對你的產品效能做過測試?哪一個表現更好,為什麼?
- 你是否打算使用其中一個數據庫專門提供的功能?
- 你是否打算使用其中一個數據庫專門提供的資料庫引擎?
- 能夠對資料庫的開發過程產生影響對你來說有多重要?能夠參與下一個功能變更投票對你來說有多重要?
- 你是要為企業版本付費還是使用社群版?社群版的功能是否能夠滿足你的需求?
- 你的作業系統是否預設支援你所選的資料庫?要部署它需不需要很多工作量?
- 你使用的是哪個雲提供商?他們是否提供託管服務,其中包括你選擇的資料庫?
- 你是否計劃將來從一種資料庫型別遷移到另一種資料庫型別?如果是這樣,你是否考慮過相容性和複製方面的問題?
更多關於MySQL和MariaDB區別與效能全面對比請檢視下面的相關連結