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時代。Sun為MySQL的發展提供了絕佳的環境,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從此進入了輝煌時代。然而,從那之後,Oracle對MySQL的态度漸漸發生了變化,Oracle雖然宣稱MySQL依然尊少GPL協定,但卻暗地裡把開發人員全部換成了Oracle自己人,開源社群再也影響不了MySQL發展的腳步,真正有心做貢獻的人也被拒之門外,MySQL随時都有閉源的可能……
橫空出世的MariaDB是什麼鬼
先提一下MySQL名字的由來吧,Michael Widenius的女兒的簡稱就是MY,Michael Widenius大概也是把MySQL當成自己的女兒吧。看着自己辛苦養大的MySQL被Oracle搞成這樣,Michael Widenius非常失望,決定在MySQL走向閉源前,将MySQL進行分支化,依然是使用了自己女兒的名字MariaDB(瑪莉亞DB)。MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,采用GPL授權許可 MariaDB的目的是完全相容MySQL,包括API和指令行,使之能輕松成為MySQL的代替品。在存儲引擎方面,使用XtraDB來代替MySQL的InnoDB。MariaDB由MySQL的創始人Michael Widenius主導,由開源社群的大神們進行開發。是以,大家都認為,MariaDB擁有比MySQL更純正的MySQL血脈。最初的版本更新與MySQL同步,相對MySQL5以後的版本,MariaDB也有相應的5.1~5.5的版本。後來MariaDB終于擺脫了MySQL,它的版本号直接從10.0開始,以自己的步伐進行開發,當然,還是可以對MySQL完全相容。現在,MariaDB的資料特性、性能等都超越了MySQL。
測試環境
本性能測試環境如下:
- CPU:I7
- 記憶體:8G
- OS:Windows 10 64位
- 硬碟類型:SSD
- MySQL:8.0.19
- MariaDB:10.4.12
分别在MySQl和MariaDB中建立名為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;
插入性能
單條插入
單條插入的測試結果如下表所示:
條數\資料庫
MySQL
MariaDB
1000 | 0:00:04.397270 | 0:00:02.534988 |
2000 | 0:00:09.839936 | 0:00:04.822289 |
3000 | 0:00:15.934843 | 0:00:07.295792 |
4000 | 0:00:20.356583 | 0:00:08.895680 |
5000 | 0:00:23.735397 | 0:00:10.766463 |
6000 | 0:00:31.431234 | 0:00:16.583214 |
7000 | 0:00:36.413297 | 0:00:17.359391 |
8000 | 0:00:40.957255 | 0:00:18.281750 |
9000 | 0:00:47.125131 | 0:00:21.483223 |
10000 | 0:00:54.979244 | 0:00:24.445878 |
平均 | 0:00:00.005185 | 0:00:00.002409 |
MariaDB單條資料插入的性能比MySQL強1倍左右。
批量插入
批量插入的測試結果如下表所示:
0:00:00.066978 | 0:00:00.019711 | |
0:00:00.086768 | 0:00:00.038898 | |
0:00:00.132641 | 0:00:00.084769 | |
0:00:00.100773 | 0:00:00.058774 | |
0:00:00.119664 | 0:00:00.178519 | |
0:00:00.313400 | 0:00:00.143641 | |
0:00:00.181570 | 0:00:00.251319 | |
0:00:00.295206 | 0:00:00.145611 | |
0:00:00.321140 | 0:00:00.124668 | |
0:00:00.328125 | 0:00:00.181082 | |
0:00:00.000035 | 0:00:00.000022 |
上面的測試結果,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秒。再用上面的測試項目進行測試,結果如下表所示:
項目\資料庫
查詢time字段最值 | 0.006秒 | 0.001秒 |
過濾time字段并排序 | 0.398秒 | 0.020秒 |
查詢level字段 | 0.065秒 | 0.049秒 |
查詢message字段 |