MySQL儲存引擎對比
阿新 • • 發佈:2020-11-23
一.MySQL的儲存引擎
大家應該知道MySQL的儲存引擎應該是表級別的概念,因為我們無法再建立database時指定儲存引擎,而是隻能在建立表的時候可以明確指定使用哪種儲存引擎。因此儲存引擎也通常被稱作“表型別”。也就是說,儲存引擎是負責跟檔案系統真正資料打交道的工具,它卻決定了表中是如何儲存資料的,不用儲存引擎他們指出的工作特性是各不相同的。所以,我們在工作時應該選擇時候適合自己的儲存引擎。 1>.檢視MySQL支援的所有儲存引擎mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | BLACKHOLE | YES | /dev/null2>.檢視某張表的儲存引擎 使用格式: SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]storage engine (anything you write to it disappears) | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9rows in set (0.01 sec)
mysql> show table status in chensiting like 'students'\G #我們可以用like來過濾 *************************** 1. row *************************** Name: students-------->表名 Engine: InnoDB ------->儲存引擎 Version: 10 -------->版本 Row_format: Compact -------->行格式 Rows: 8 -------->現存表中的行數,對於InnoDB的儲存引擎的話這個數字可能只是一個估計值,因為innodb支援事物,其中還儲存著刪除的行數。 Avg_row_length: 2048 --------->平均每行所包含的位元組數 Data_length: 16384 --------->表中資料總體大小,單位是位元組 Max_data_length: 0 --------->表能夠佔用的最大空間,單位為位元組。注意,“0”則表示沒有上線喲! Index_length: 16384 --------->索引的大小,單位也是位元組 Data_free: 0 ---------->對於MyISAM表,表示已經分配但尚未使用的空間,其中包含此前刪除行之後騰出來的空間。 Auto_increment: 13 ---------->下一個AUTO_INCREMENT的值 Create_time: 2020-11-21 04:11:46 ----------->表的建立時間 Update_time: NULL ----------->表資料的最後一次修改時間 Check_time: NULL ------------>使用CHECK TABLE或myisamchk最近一次檢查表的時間 Collation: utf8_general_ci ------------->排序規則 Checksum: NULL ------------->如果啟動,則為表的checksum Create_options: ------------->建立表時指定使用的其他選項 Comment: ------------->表的註釋資訊 1 row in set (0.00 sec) mysql> show table status in chensiting where name='students'\G #當然用where查詢的效能會更好 *************************** 1. row *************************** Name: students Engine: InnoDB Version: 10 Row_format: Compact Rows: 8 Avg_row_length: 2048 Data_length: 16384 Max_data_length: 0 Index_length: 16384 Data_free: 0 Auto_increment: 13 Create_time: 2020-11-21 04:11:46 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
3>.行格式
MySQL的行格式有: {DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT}, 其中DYNAMIC|FIXED|COMMPRESSED是MyISAM常用的的,而InnoDB即可以使用MyISAM常用的型別還可以使用REDUNDANT|COMPACT等等。
二.MyISAM和InnoDB的儲存引擎對比
1>.什麼是表空間(table space)它是由InnoDB管理的特有格式資料檔案,內部可同時儲存資料和索引
2>.MyISAM資料儲存結果
MySQL的每個表都在資料庫目錄下儲存三個檔案,名稱如下: a>.tb_name.frm #儲存表結構 b>.tb_name.MYD #儲存資料 c>.tb_name.MYI #儲存索引
3>.InnoDB
Innodb有兩種格式: a>.innodb_file_per_table=OFF,即是用共享表空間 每個表一個獨有的格式定義檔案:tb_name.frm 還有一個預設位於資料目錄下的共享的表空間檔案:ibdata#(它是會自動增長的,比如ibdata1,ibdata2,...) b>.innodb_file_per_table=ON,即是用獨立表空間 每個表在資料庫目錄下儲存兩個檔案 tb_name.frm #儲存表結構 tb_name.ibd #儲存資料
4>.修改預設的儲存引擎
通過default_storage_engine服務變數實現。可以用mysql> show variables like '%default%'來檢視相應的資訊
三.MySQL各儲存引擎的特性
1>.InnoDB儲存引擎a>.支援事務: 有事務日誌,這些事物日誌檔案的大小是一致的喲!):ib_logfile#(例如:ib_logfile0,ib_logfile1,....); b>.支援外來鍵約束; c>.支援MVCC(多版本併發控制); d>.支援聚簇索引: 聚簇索引之外的其他索引,通常稱之為輔助索引,一張表聚簇索引只能有一個而輔助索引可以有多個。聚簇索引通常是用主鍵的方式來實現,(因為主鍵的資料是不允許重複的); e>.行級鎖:間隙鎖; f>.支援使用輔助索引; g>.支援自適應的hash索引; h>.支援熱備份,因此資料不需要離線就可以完成備份啦,當然可能要用獨立表空間;
2>.MyISAM
MyISAM的使用場景: 只讀資料,表較小,能夠忍受崩潰後的修復操作和資料丟失,它具有一下特點: a>.全文索引 b>.支援表壓縮存放:做資料倉庫,能節約儲存空間並提升效能 c>.支援空間索引 d>.表級鎖 e>.延遲更新索引 f>.不支援事務、外來鍵和行級鎖 g>.崩潰後無法安全恢復資料 MySQL的mysql庫使用就是MyISAM儲存引擎,我們可以使用“mysql> show table status in mysql\G”進行檢視。
3>.ARCHIVE(歸檔)
僅支援INSERT和SELECT,支援很好壓縮功能。應用於儲存日誌資訊,或其他按照時間序列實現的資料採集類的應用。它不支援事物,不能很好的支援索引
4>.CSV
將資料儲存為CSV格式,不支援索引,僅使用與資料交換場景。說白了就是可以在多種不同的資料庫之間來回匯入匯出資料庫的。也就是說我們可以將office的文件儲存為CSV就可以直接向MySQL資料庫匯入;
5>.BLACKHOLE
又名黑洞儲存引擎,沒有儲存機制,任何發往次引擎的資料都會丟棄,其會記錄二進位制日誌,因此,常用於多級複製架構中作中轉伺服器
6>.MEMORY
儲存資料在記憶體中,它是一個記憶體表(也就是說重啟作業系統之後就會丟失該表的資料喲!);常用於儲存中間資料,如週期性的聚合資料等,也用於實現臨時表,支援hash索引,使用表級鎖,不支援BLOB和TEXT資料型別。
7>.MRG_MYISAM
是MYISAM的一個變種,能夠將多個MyISAM表合併成一個虛表。它是傳統的MySQL儲存引擎,現在基本上很少有人用了,因為一個表的資料內容本來就很大了,人們更多考慮的是如何將一張表的內容如何拆分開來。
8>NDB
是MySQL CLUSTER中專用的儲存引擎。它是叢集用的一種儲存引擎,但是這種叢集案例用的幾乎寥寥無幾
四.第三方的儲存引擎
1>.線上儲存引(簡稱,OLPT),常見的有以下三種: XtraDB
它是增強的InnoDB,有Percona提供。
編譯安裝時,下載XtraDB的原始碼替代MySQL儲存引擎中的InnoDB的原始碼(當然你得把XtraDB的名稱改為InnoDB喲)
PBXT:
MariaDB自帶此儲存引擎
支援引擎級別的複製、外來鍵約束,對SSD磁碟(固態磁碟)提供適當支援,當然也支援事務和MVCC等等。
TokuDB:
使用 Fractal Trees索引,適用儲存大資料,擁有很好的壓縮比,已經被引入MariaDB。
2>.按照列式資料儲存引擎分為以下幾種4種:
Infobright
目前較有名的列式引擎,適用於海量資料儲存場景,如PB級別,專為資料分析和資料倉庫設計,分為商業版本和社群版本,其他三個都不是特別有名。
InfiniDB
MonetDB
LucidDB
3>.按照開源社群儲存引擎分為以下幾種:
Aria:
前身為Maria,是增強版的MyISAM(支援崩潰後安全恢復,支援資料快取)
Groona:
全文索引引擎
Mroonga:
是基於Groona的二次開發版
OQGraph:
由open query研發,支援圖(網狀 )結構的儲存引擎
SphinxSE:
為Sphinx全文搜尋伺服器提供了SQL介面
Spider:
能將資料切分成不同的分片,比較高效透明的實現了分片(shared),並支援在分片上支援並行查詢