MySQL與MariaDB效能比拼,哪個更出色?

Laravel00發表於2021-12-16

文章來自:PHP開源社群    

MySQL的發展史

MySQL的歷史可以追溯到1979年,它的創始人叫作Michael Widenius,他在開發一個報表工具的時候,設計了一套API,後來他的客戶要求他的API支援sql語句,他直接藉助於mSQL(當時比較牛)的程式碼,將它整合到自己的儲存引擎中。但是他總是感覺不滿意,萌生了要自己做一套資料庫的想法。

一到1996年,MySQL 1.0釋出,僅僅過了幾個月的時間,1996年10月MySQL 3.11.1當時釋出了Solaris的版本,一個月後,linux的版本誕生,從那時候開始,MySQL慢慢的被人所接受。1999年,Michael Widenius成立了MySQL AB公司,MySQL由個人開發轉變為團隊開發,2000年使用GPL協議開源。

2001年,MySQL生命中的大事發生了,那就是儲存引擎InnoDB的誕生!直到現在,MySQL可以選擇的儲存引擎,InnoDB依然是No.1。2008年1月,MySQL AB公司被Sun公司以10億美金收購,MySQL資料庫進入Sun時代。SunMySQL的發展提供了絕佳的環境,2008年11月,MySQL 5.1釋出,MySQL成為了最受歡迎的小型資料庫。

在此之前,Oracle在2005年就收購了InnoDB,因此,InnoDB一直以來都只能作為第三方外掛供使用者選擇。2009年4月,Oracle公司以74億美元收購Sun公司,MySQL也隨之進入Oracle時代。

2010年12月,MySQL 5.5釋出,Oracle終於把InnoDB做成了MySQL預設的儲存引擎,MySQL從此進入了輝煌時代。

然而,從那之後,OracleMySQL的態度漸漸發生了變化,Oracle雖然宣稱MySQL依然尊少GPL協議,但卻暗地裡把開發人員全部換成了Oracle自己人,開源社群再也影響不了MySQL發展的腳步,真正有心做貢獻的人也被拒之門外,MySQL隨時都有閉源的可能……

橫空出世的MariaDB是什麼鬼

先提一下MySQL名字的由來吧,Michael Widenius的女兒的簡稱就是MYMichael Widenius大概也是把MySQL當成自己的女兒吧。

看著自己辛苦養大的MySQLOracle搞成這樣,Michael Widenius非常失望,決定在MySQL走向閉源前,將MySQL進行分支化,依然是使用了自己女兒的名字MariaDB(瑪莉亞DB)。

MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,採用GPL授權許可 MariaDB的目的是完全相容MySQL,包括API和命令列,使之能輕鬆成為MySQL的代替品。

在儲存引擎方面,使用XtraDB來代替MySQLInnoDBMariaDBMySQL的創始人Michael Widenius主導,由開源社群的大神們進行開發。

因此,大家都認為,MariaDB擁有比MySQL更純正的MySQL血脈。最初的版本更新與MySQL同步,相對MySQL5以後的版本,MariaDB也有相應的5.1~5.5的版本。後來MariaDB終於擺脫了MySQL,它的版本號直接從10.0開始,以自己的步伐進行開發,當然,還是可以對MySQL完全相容。現在,MariaDB的資料特性、效能等都超越了MySQL

測試環境

本效能測試環境如下:

CPUI7
記憶體:8G
OS:Windows 10 64位
硬碟型別:SSD
MySQL:8.0.19
MariaDB:10.4.12

分別在MySQlMariaDB中建立名為performance的資料庫,並建立log表,都使用innodb作為資料庫引擎:

CREATE TABLE `performance`.`log`(  
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `time` DATETIME NOT NULL,
  `level` ENUM('info','debug','error') NOT NULL,
  `message` TEXT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;

插入效能

單條插入

單條插入的測試結果如下表所示:圖片
MariaDB 單條資料插入的效能比 MySQL 強1倍左右。

批量插入

批量插入的測試結果如下表所示:

圖片

上面的測試結果,MariaDB 並沒有絕對優勢,甚至有時還比 MySQL 慢,但平均水平還是高於MySQL

查詢效能

經過了多次插入測試,我兩個資料庫裡插入了很多資料,此時用下面的sql查詢表中的資料量:

SELECT COUNT(0) FROM LOG

結果兩個表都是6785000條,MariaDB用時3.065秒,MySQL用時6.404秒。此時我機器的記憶體用了6個G,MariaDB用了474284 K,MySQL只用了66848 K。看來MariaDB快是犧牲了空間換取的。

無索引

先查詢一下time欄位的最大值和最小值:

SELECT MAX(TIME), MIN(TIME) FROM LOG

結果:MariaDB用時6.333秒,MySQL用時8.159秒。

接下來測試過濾time欄位在0點到1點之間的資料,並對time欄位排序:

SELECT * FROM LOG WHERE TIME > 
'2020-02-04 00:00:00'
 AND TIME < 
'2020-02-04 01:00:00'
 ORDER BY TIME

結果:MariaDB用時6.996秒,MySQL用時10.193秒。

然後測試查詢level字元是info的資料:

SELECT * FROM LOG WHERE LEVEL = 'info'

結果:MariaDB用時0.006秒,MySQL用時0.049秒。

最後測試查詢message欄位值為debug的資料:

SELECT * FROM LOG WHERE MESSAGE = 'debug'

結果:MariaDB用時0.003秒,MySQL用時0.004秒。

有索引

分別對兩個資料庫的欄位建立索引:

ALTER TABLE `performance`.`log`   
  ADD  INDEX `time` (`time`),
  ADD  INDEX `level` (`level`),
  ADD FULLTEXT INDEX `message` (`message`);

MariaDB用時2分47秒,MySQL用時3分48秒。再用上面的測試專案進行測試,結果如下表所示:圖片有些結果新增了索引後還不如不加索引時理想,說明實際使用時並不是每個欄位都需要新增索引的。

總結

在上面的測試中MariaDB的效能的確優於MySQL,看來各大廠商放棄MySQL擁抱MariaDB還是非常有道理的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
溫馨提示:微信搜尋並關注   學Laravel  裡面有兩套Laravel課程:【laravel7.x 從入門到核心架構講解】 與 【Laravel高階實戰教程42集】,直接獲取就可以了,學習與交流可加入:PHP技術交流微信群

相關文章