MariaDB和MySQL全面對比:選擇數(shù)據(jù)庫需要考慮這幾點(diǎn)
這篇文章的目的主要是比較 MySQL 和 MariaDB 之間的主要相似點(diǎn)和不同點(diǎn)。我們將從性能、安全性和主要功能方面對這兩個數(shù)據(jù)庫展開對比,并列出在選擇數(shù)據(jù)庫時需要考慮的重要事項(xiàng)。
誰在使用 MySQL 和 MariaDB?
MySQL 和 MariaDB 都發(fā)布了各自的用戶名單。
- 使用 MySQL 的有 Facebook、Github、YouTube、Twitter、PayPal、諾基亞、Spotify、Netflix 等。
- 使用 MariaDB 的有 Redhat、DBS、Suse、Ubuntu、1&1、Ingenico 等。
功能比較
有一些令人興奮的新功能(如窗口函數(shù)、角色控制或公共表表達(dá)式(CTE))可能值得一提,但本文只是為了比較兩個數(shù)據(jù)庫,所以我們在這里只討論其中一方專門提供的功能,以便更好地幫助讀者選擇合適自己的數(shù)據(jù)庫。
讓我們來看一下只有其中一個數(shù)據(jù)庫專門提供的功能:
1. JSON 數(shù)據(jù)類型——從 5.7 版本開始,MySQL 支持由 RFC 7159 定義的原生 JSON 數(shù)據(jù)類型,可以高效地訪問 JSON 文檔中的數(shù)據(jù)。
MariaDB 沒有提供這一增強(qiáng)功能,認(rèn)為 JSON 數(shù)據(jù)類型不是 SQL 標(biāo)準(zhǔn)的一部分。但為了支持從 MySQL 復(fù)制數(shù)據(jù),MariaDB 為 JSON 定義了一個別名,實(shí)際上就是一個 LONGTEXT 列。MariaDB 聲稱兩者之間沒有顯著的性能差異,但他們并沒有提供基準(zhǔn)測試數(shù)據(jù)來支持這個說法。
值得注意的是,MySQL 和 MariaDB 都提供了一些 JSON 相關(guān)函數(shù),用于更方便地訪問、解析和檢索 JSON 數(shù)據(jù)。
2. 默認(rèn)身份認(rèn)證——在 MySQL 8.0 中,默認(rèn)的身份認(rèn)證插件是 caching_sha2_password,而不是 mysql_native_password。這一增強(qiáng)通過使用 SHA-256 算法提高了安全性。
3. MySQL Shell——MySQL Shell 是 MySQL 的高級命令行客戶端和代碼編輯器。除了 SQL 之外,MySQL Shell 還提供了 JavaScript 和 Python 腳本功能。不過用戶不能使用 mysqlsh 訪問 MariaDB 服務(wù)器,因?yàn)?MariaDB 不支持 MySQL X 協(xié)議。
4. 加密——MySQL 對重做 / 撤消日志進(jìn)行了加密(可配),但不加密臨時表空間或二進(jìn)制日志。相反,MariaDB 支持二進(jìn)制日志和臨時表加密。
5. 密鑰管理——MariaDB 提供開箱即用的 AWS 密鑰管理插件。MySQL 也提供了一些用于密鑰管理的插件,但它們僅在企業(yè)版中可用。
6. sys 模式——MySQL 8.0 提供了 sys 模式,這是一組對象,可幫助數(shù)據(jù)庫管理員和軟件工程師更好地理解通過 Performance 模式收集的數(shù)據(jù)。sys 模式對象可用于優(yōu)化和診斷,不過 MariaDB 沒有提供這個增強(qiáng)功能。
7. validate_password 插件——validate_password 插件主要用于測試密碼并提高安全性。MySQL 默認(rèn)啟用了這個插件,而 MariaDB 則不啟用。
8. 超級只讀—— MySQL 通過提供超級只讀(super read-only)模式來增強(qiáng) read_only 功能。如果啟用了 read_only,服務(wù)器只允許具有 SUPER 權(quán)限的用戶執(zhí)行客戶端更新。如果同時啟用了 super_read_only,那么服務(wù)器將禁止具有 SUPER 權(quán)限的用戶執(zhí)行客戶端更新。
9. 不可見列——這個功能在 MariaDB 上可用,MySQL 不支持該功能。這個功能允許創(chuàng)建未在 SELECT * 語句中出現(xiàn)的列,而在進(jìn)行插入時,如果它們的名字沒有出現(xiàn)在 INSERT 語句中,就不需要為這些列提供值。
10. 線程池——MariaDB 支持連接線程池,這對于短查詢和 CPU 密集型的工作負(fù)載(OLTP)來說非常有用。在 MySQL 的社區(qū)版本中,線程數(shù)是固定的,因而限制了這種靈活性。MySQL 計(jì)劃在企業(yè)版中增加線程池功能。
性能
近年來,出現(xiàn)了很多關(guān)于 MySQL 和 MariaDB 引擎性能的基準(zhǔn)測試。我們不認(rèn)為“MySQL 或 MariaDB 哪個更快”這個問題會有一個最終的答案,它在很大程度上取決于具體的使用場景、查詢、用戶和連接數(shù)量等因素。
不過,如果你確實(shí)想知道,下面列出了我們發(fā)現(xiàn)的一些***的基準(zhǔn)測試結(jié)果。請注意,這些測試都是在一組特定的數(shù)據(jù)庫 + 引擎(例如 MySQL+InnoDB)組合上進(jìn)行的,因此得出的結(jié)論只與特定的組合有關(guān)。
- MySQL 8.0(InnoDB)和 MariaDB 10.3.7(MyRocks)基準(zhǔn)測試對比: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
復(fù)制
兩個數(shù)據(jù)庫都提供了將數(shù)據(jù)從一個服務(wù)器復(fù)制到另一個服務(wù)器的功能。它們的主要區(qū)別是大多數(shù) MariaDB 版本允許你從 MySQL 復(fù)制數(shù)據(jù),這意味著你可以輕松地將 MySQL 遷移到 MariaDB。但反過來卻沒有那么容易,因?yàn)榇蠖鄶?shù) MySQL 版本都不允許從 MariaDB 復(fù)制數(shù)據(jù)。
此外,值得注意的是,MySQL GTID 不同于 MariaDB GTID,所以將數(shù)據(jù)從 MySQL 復(fù)制到 MariaDB 后,GTID 數(shù)據(jù)將相應(yīng)地做出調(diào)整。
以下是這兩個數(shù)據(jù)庫在復(fù)制配置方面的一些差別:
- MySQL 的默認(rèn)二進(jìn)制日志格式是基于行的,而在 MariaDB 中,默認(rèn)的二進(jìn)制日志格式是混合式的。
- log_bin_compress——這個配置決定了是否可以壓縮二進(jìn)制日志。這個增強(qiáng)功能是 MariaDB 獨(dú)有的,因此 MySQL 不支持。
MySQL 和 MariaDB 之間的不兼容性
MariaDB 的文檔中列出了 MySQL 和 MariaDB 之間的數(shù)百個不兼容問題。因此,我們無法通過簡單的方案在這兩個數(shù)據(jù)庫之間進(jìn)行遷移。
大多數(shù)數(shù)據(jù)庫管理員都希望 MariaDB 只是作為 MySQL 的一個 branch,這樣就可以輕松地在兩者之間進(jìn)行遷移。但從***發(fā)布的幾個版本來看,這種想法是不現(xiàn)實(shí)的。MariaDB 實(shí)際上是 MySQL 的一個 fork,這意味著在它們之間進(jìn)行遷移需要考慮很多東西。
存儲引擎
MariaDB 比 MySQL 支持更多的存儲引擎類型。但話說回來,數(shù)據(jù)庫可以支持多少個存儲引擎并不重要,重要的是哪個數(shù)據(jù)庫可以支持適合你需求的存儲引擎。
- 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 上安裝
當(dāng)你在某些 Linux 發(fā)行版上安裝 MySQL 時,***可能安裝的是 MariaDB,因?yàn)樗呛芏?不是全部)Linux 發(fā)行版的默認(rèn)設(shè)置。
Red Hat Enterprise/CentOS/Fedora/Debian 發(fā)行版默認(rèn)會安裝 MariaDB,而其他發(fā)行版(如 Ubuntu)默認(rèn)安裝 MySQL。
云平臺上的可用性
MariaDB 可作為運(yùn)行在 Amazon Web Services(AWS)、微軟 Azure 和 Rackspace Cloud 上的服務(wù)。
MySQL 在上面提到的三個平臺上也是可用的,同時還可以作為托管服務(wù)在谷歌云服務(wù)平臺上運(yùn)行。
因此,如果你正在使用谷歌云平臺,并希望云提供商為你管理服務(wù),那么可以考慮使用 MySQL,除非你希望自己安裝和管理 MariaDB 實(shí)例。
許可
MariaDB 采用了 GPL v2 許可,而 MySQL 提供了兩個許可選項(xiàng)——GPL v2(用于社區(qū)版)和企業(yè)許可。
MySQL 的兩個許可之間的主要區(qū)別在于可用的功能和支持服務(wù)。用戶可以使用 MariaDB 的所有功能,但對于 MySQL 來說并非如此。MySQL 的社區(qū)版不包含線程池等功能,而這些功能會對數(shù)據(jù)庫和查詢性能產(chǎn)生重大影響。
發(fā)布頻率和更新
通常,MariaDB 的發(fā)布頻率比 MySQL 更頻繁。太高的發(fā)布頻率既有利也有弊。從好的方面來說,用戶可以更及時地收到功能和錯誤修復(fù)。從不好的方面來說,為了讓 MariaDB 保持***的狀態(tài),需要更多的工作量。
技術(shù)支持
MySQL 的支持團(tuán)隊(duì)(包括 MySQL 開發(fā)人員和支持工程師)為客戶提供全天候服務(wù)。甲骨文提供了多種支持選項(xiàng),包括擴(kuò)展支持、持續(xù)支持和高級支持,具體取決于客戶的要求。MariaDB 支持團(tuán)隊(duì)的支持工程師包括了 MariaDB 和 MySQL 數(shù)據(jù)庫專家(因?yàn)楹芏喙δ茏畛跏怯?MySQL 團(tuán)隊(duì)開發(fā)的),他們?yōu)樯a(chǎn)系統(tǒng)提供全天候的企業(yè)級支持。
正在進(jìn)行中的開發(fā)
MySQL 的開發(fā)者主要是甲骨文的 MySQL 團(tuán)隊(duì),而 MariaDB 開發(fā)通過公開投票和郵件列表討論的方式進(jìn)行。此外,任何人都可以向 MariaDB 提交補(bǔ)丁,MariaDB 開發(fā)團(tuán)隊(duì)會考慮將這些補(bǔ)丁添加到主代碼庫中。因此,從某種程度上說,MariaDB 是由社區(qū)開發(fā)的,而 MySQL 主要由甲骨文開發(fā)。
結(jié)論
好吧,我們無法為你做出決定。我們能做的就是有針對性地問你一些問題,然后你自己做出決定:
- 你是否分別基于這兩個數(shù)據(jù)庫對你的產(chǎn)品性能做過測試?哪一個表現(xiàn)更好,為什么?
- 你是否打算使用其中一個數(shù)據(jù)庫專門提供的功能?
- 你是否打算使用其中一個數(shù)據(jù)庫專門提供的數(shù)據(jù)庫引擎?
- 能夠?qū)?shù)據(jù)庫的開發(fā)過程產(chǎn)生影響對你來說有多重要?能夠參與下一個功能變更投票對你來說有多重要?
- 你是要為企業(yè)版本付費(fèi)還是使用社區(qū)版?社區(qū)版的功能是否能夠滿足你的需求?
- 你的操作系統(tǒng)是否默認(rèn)支持你所選的數(shù)據(jù)庫?要部署它需不需要很多工作量?
- 你使用的是哪個云提供商?他們是否提供托管服務(wù),其中包括你選擇的數(shù)據(jù)庫?
- 你是否計(jì)劃將來從一種數(shù)據(jù)庫類型遷移到另一種數(shù)據(jù)庫類型?如果是這樣,你是否考慮過兼容性和復(fù)制方面的問題?
- 如果你能回答好這些問題,可能就很清楚哪個數(shù)據(jù)庫更適合你。