MariaDB数据存储引擎的选择
MariaDB數據存儲引擎的選擇
像MySQL一樣MariaDB,也有很多數據存儲引擎,其官方網站對每個引擎都有非常詳細的介紹。
寫這篇文章之前,我一直以為InnoDB才是王道,事實上,每種存儲引擎都有各自的特點,就像不同的編程語言一樣,沒有優劣之分,只有適用的場景不同。這里列舉幾個常用的數據存儲引擎:
| MyISAM | 不支持事務和外鍵,但insert和select速度非常快 |
| Aria | MyISAM存儲引擎的增強版,支持自動崩潰安全恢復 |
| XtraDB | InnoDB的增強版,支持事務處理 |
| CSV | 將數據保存在CSV文件中 |
| MEMORY | 將數據保存在內存中,讀寫速度快,但關閉時數據會丟失 |
| SphinxSE | Sphinx使用的引擎,支持數據全文檢索 |
作為一篇關注性能的文章,本文重點測試MyISAM、Aria和XtraDB的的性能。當然,三者只有XtraD支持事務,測試是在不使用事務的場景下進行的。
測試環境
本性能測試環境如下:
- CPU:I7
- 內存:8G
- OS:Windows 10 64位
- 硬盤類型:SSD
- MariaDB:10.4.12
分別用三種引擎創建三張表,MariaDB為了與MySQL兼容,要使用XtraDB,還是需要指定為InnoDB。
CREATE TABLE `performance`.`log_xtradb`( `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;CREATE TABLE `performance`.`log_myisam`( `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=MYISAM CHARSET=utf8;CREATE TABLE `performance`.`log_aria`( `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=ARIA CHARSET=utf8;插入性能
單條插入
單條插入的測試結果如下表所示:
| 1000 | 0:00:02.819683 | 0:00:00.712045 | 0:00:02.679292 |
| 2000 | 0:00:05.645522 | 0:00:01.245605 | 0:00:04.919199 |
| 3000 | 0:00:08.640754 | 0:00:01.007064 | 0:00:08.578473 |
| 4000 | 0:00:11.783709 | 0:00:02.630398 | 0:00:09.977887 |
| 5000 | 0:00:15.312341 | 0:00:02.340841 | 0:00:15.730704 |
| 6000 | 0:00:17.619624 | 0:00:04.742592 | 0:00:18.107170 |
| 7000 | 0:00:21.330231 | 0:00:03.628463 | 0:00:19.398530 |
| 8000 | 0:00:24.137878 | 0:00:04.868233 | 0:00:21.840180 |
| 9000 | 0:00:26.558606 | 0:00:05.701740 | 0:00:26.071422 |
| 10000 | 0:00:30.758629 | 0:00:03.409164 | 0:00:29.096098 |
| 平均 | 0:00:00.002993 | 0:00:00.000551 | 0:00:00.002844 |
單條數據插入XtraDB與Aria相差不大,而MyISAM表現特別突出,比二者的速度快5倍以上。
批量插入
批量插入的測試結果如下表所示:
| 1000 | 0:00:00.024932 | 0:00:00.010970 | 0:00:00.015546 |
| 2000 | 0:00:00.031166 | 0:00:00.034886 | 0:00:00.039567 |
| 3000 | 0:00:00.078076 | 0:00:00.031006 | 0:00:00.062644 |
| 4000 | 0:00:00.079511 | 0:00:00.046863 | 0:00:00.103948 |
| 5000 | 0:00:00.077702 | 0:00:00.062485 | 0:00:00.094910 |
| 6000 | 0:00:00.097492 | 0:00:00.063765 | 0:00:00.105757 |
| 7000 | 0:00:00.093764 | 0:00:00.093483 | 0:00:00.143457 |
| 8000 | 0:00:00.105830 | 0:00:00.077884 | 0:00:00.150275 |
| 9000 | 0:00:00.106734 | 0:00:00.093512 | 0:00:00.187510 |
| 10000 | 0:00:00.123175 | 0:00:00.093367 | 0:00:00.234525 |
| 平均 | 0:00:00.000015 | 0:00:00.000011 | 0:00:00.000021 |
即便是批量插入操作,MyISAM的性能也要比InnoDB和Aria好一些。
查詢性能
經過了多次插入測試,我兩個數據庫里插入了很多數據,此時用下面的sql查詢表中的數據量:
SELECT COUNT(0) FROM LOG_XTRADB; SELECT COUNT(0) FROM LOG_MYISAM; SELECT COUNT(0) FROM LOG_ARIA;三個表都是11110000條數據,查詢XtraDB用時2.761秒,MyISAM和Aria都是0秒,原因是MyISAM和Aria記錄了表內的數據量,直接取出了,如果使用where條件后,三者的執行邏輯就相同了。
無索引
先查詢一下time字段的最大值和最小值:
SELECT MAX(TIME), MIN(TIME) FROM LOG_XTRADB; SELECT MAX(TIME), MIN(TIME) FROM LOG_MYISAM; SELECT MAX(TIME), MIN(TIME) FROM LOG_ARIA;XtraDB用時4.892秒,MyISAM用時3.676秒,Aria用時5.526秒。
接下來測試過濾time字段在0點到1點之間的數據,并對time字段排序:
SELECT * FROM LOG_XTRADB WHERE TIME > '2020-02-04 00:00:00' AND TIME < '2020-02-04 01:00:00' ORDER BY TIME; SELECT * FROM LOG_MYISAM WHERE TIME > '2020-02-04 00:00:00' AND TIME < '2020-02-04 01:00:00' ORDER BY TIME; SELECT * FROM LOG_ARIA WHERE TIME > '2020-02-04 00:00:00' AND TIME < '2020-02-04 01:00:00' ORDER BY TIME;XtraDB用時5.399秒,MyISAM用時4.163秒,Aria用時5.314秒。
然后測試查詢level字符是info的數據:
SELECT * FROM LOG_XTRADB WHERE LEVEL = 'info'; SELECT * FROM LOG_MYISAM WHERE LEVEL = 'info'; SELECT * FROM LOG_ARIA WHERE LEVEL = 'info';XtraDB用時0.099秒,MyISAM用時0.026秒,Aria用時0.028秒。
最后測試查詢message字段值為debug的數據:
XtraDB用時0.025秒,MyISAM用時0.003秒,Aria用時0.003秒。
無索引的情況下,MyISAM的查詢性能比XtraDB能好上不少。
有索引
分別對三個表中的每個字段創建索引:
ALTER TABLE `performance`.`log_xtradb` ADD INDEX `time` (`time`),ADD INDEX `level` (`level`),ADD FULLTEXT INDEX `message` (`message`); ALTER TABLE `performance`.`log_myisam` ADD INDEX `time` (`time`),ADD INDEX `level` (`level`),ADD FULLTEXT INDEX `message` (`message`); ALTER TABLE `performance`.`log_aria` ADD INDEX `time` (`time`),ADD INDEX `level` (`level`),ADD FULLTEXT INDEX `message` (`message`);XtraDB用時6分56秒,MyISAM用時4分8秒,Aria用時4分43秒。再用上面的測試項目進行測試,結果如下表所示:
| 查詢time字段最值 | 0.010秒 | 0.002 | 0.002秒 |
| 過濾time字段并排序 | 0.020秒 | 0.009秒 | 0.015秒 |
| 查詢level字段 | 0.023秒 | 0.010秒 | 0.003秒 |
| 查詢message字段 | 0.036秒 | 0.003秒 | 0.003秒 |
有索引的情況下,MyISAM的查詢性能依然比XtraDB更有優勢。
總結
不能盲目追求XtraDB的傳說。在業務過程中應該綜合考慮,對于數據量大的表,盡量使用MyISAM引擎,避免事務操作,只有對必須啟用事務的表,才選擇XtraDB作為數據存儲引擎。
總結
以上是生活随笔為你收集整理的MariaDB数据存储引擎的选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01博弈三要素和囚徒困境
- 下一篇: HERP和单臂路由结合配置时,提示 %I