mysql進階系列:mysql的儲存引擎有什麼區別,該怎麼選擇
本文mysql實驗版本 : 5.7.21
基礎架構篇瞭解到執行器執行這個執行計劃,通過呼叫儲存引擎的API來操作資料。
mysql提供了一系列儲存引擎的API,所有的儲存引擎都要符合API要求,因此可以實現這種外掛式的儲存引擎,可以根據不同的需求選擇合適的儲存引擎(就像握推槓鈴一樣,可以按需選擇不同大小的槓鈴片,嗯對的)。
儲存引擎是針對表的而不是庫,對於同一個庫不同的表可以使用不同的儲存引擎。
常見的儲存引擎有 MyISAM,InnoDB,Memory
檢視當前資料支援的儲存引擎:
-
在新建表的時候可以選擇儲存引擎
CREATE TABLE 'user' ( 'id' bigint(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' ) ENGINE = MyISAM
ENGINE = MyISAM 代表這個表的儲存引擎是MyISAM 。
-
查看錶相關資訊,例如mysql庫中的user表
-
使用show table status 查看錶資訊(不限版本)
需要先切換到對應的資料庫下再執行此命令
mysql> use mysql; Database changed mysql> show table status like 'user' \G ; ***************************1. row *************************** Name: user Engine: MyISAM Version: 10 Row_format: Dynamic Rows: 3 Avg_row_length: 128 Data_length: 384 Max_data_length: 281474976710655 Index_length: 4096 Data_free: 0 Auto_increment: NULL Create_time: 2018-06-11 09:51:16 Update_time: 2018-06-11 09:53:08 Check_time: NULL Collation: utf8_bin Checksum: NULL Create_options: Comment: Users and global privileges 1 row in set (0.00 sec)
-
還可以使用information_schema查看錶資訊(mysql5.0以後的版本支援)
會查出例項中所有庫中的表資訊,但是可以指定TABLE_SCHEMA查詢指定庫的表
簡單介紹小輸出欄位的含義:
Name: 表名。
Engine: 儲存引擎。
Version:版本,預設10。
Row_format: 行的格式。
Rows: 表中的行數,對應MyISAM和其他一些儲存引擎,該值是精確的; 而InnoDB該值是估計的。
Avg_row_length: 平均每行包含的位元組數。
Data_length: 表資料的大小(位元組)。
Max_data_length: 表資料的最大容量(和儲存引擎有關)。
Index_length: 索引的大小(位元組)。
Data_free: 對於MyISAM表,表示已經分配但是沒有使用的空間。
Auto_increment: 下一個auto_increment值。
Create_time: 表的建立時間。
Update_time: 表資料最後修改時間。
Check_time: 使用check table命令或者myisamchk工具最後一次檢查表的時間。
Collation: 表的預設字符集和字元列排序規則。
Checksum: 如果啟用儲存的是整個表的實時校驗和。
Create_options: 建立表是指定的其他選項。
Comment: 包含其他額外資訊
1. InnoDB
InnoDB是mysql5.5.x開始預設的事務型引擎,也是使用最廣泛的儲存引擎。被設計用來處理大量短期事務的。
InnoDB所有的表都儲存在同一個資料檔案中(也可能是多個檔案,或者是獨立的表空間檔案),表的大小隻受限於作業系統檔案的大小。表的結構定義存在.frm字尾檔案中,資料和索引集中存放在.idb字尾檔案中。因為表資料和索引是在同一個檔案,InnoDB的索引是聚簇索引。
InnoDB採用MVCC支援高併發,並且實現了四種標準的隔離級別(讀未提交,讀已提交,可重複讀,可序列化),其預設級別是REPEATABLE-READ(可重複讀),並且通過間隙鎖(next-key locking)策略防止幻讀的出現。間隙鎖不僅僅鎖定查詢涉及的行,還會對索引中的間隙行進行鎖定,以防止幻影行的插入。
InnoDB表是基於聚簇索引建立的,聚簇索引對主鍵的查詢有很高的效能。但是InnoDB的非主鍵索引中必須包含主鍵列,所以如果主鍵列很大的話,非主鍵索引也會很大。如果一張表的索引較多,主鍵應該儘可能的小。關於索引,後面會詳細講解。
InnoDB的內部優化,包括磁碟預讀(從磁碟讀取資料時採用可預測性讀取),自適應雜湊(自動在記憶體中建立hash索引以加速讀操作)以及能夠加速插入操作的插入緩衝區。
2. MyISAM
在mysql5.1及之前的版本,MyISAM是預設的儲存引擎。提供了大量的特性,包括全文索引,壓縮,空間函式等,但是不支援事務和行級鎖,而且有一個嚴重的問題是奔潰後無法安全恢復。
MyISAM的資料表儲存在磁碟上是3個檔案,表結構定義存在.frm字尾檔案中,表資料儲存在.MYD字尾檔案中,表索引儲存在.MYI字尾檔案中。表資料和表索引在不同的檔案中,所以MyISAM索引是非聚簇索引。而且MyISAM可以儲存表資料的總行數。
MyISAM表支援資料壓縮,對於表建立後並匯入資料以後,不需要修改操作,可以採用MyISAM壓縮表。壓縮命令:myisampack,壓縮表可以極大的減少磁碟空間佔用,因此也可以減少磁碟I/O,提高查詢效能。而且壓縮表中的資料是單行壓縮,所以單行讀取是不需要解壓整個表。
3. Memory
Memory儲存引擎的資料是存放在記憶體中的,所以如果伺服器重啟會導致資料丟失,但是表結構還是存在的表結構是以 .frm 字尾的檔案中。
Memory預設hash索引,因此查詢非常快。Memory表是表級鎖,因此併發寫入的效能較低。不支援BLOB或TEXT型別的列,並且每行的長度都是固定的,所以即使指定了varchar列實際儲存也會轉換成char,會導致記憶體浪費。
如果mysql查詢過程中需要使用臨時表來儲存中間結果,內部使用的臨時表就是Memory表,如果中間結果太大超出Memory表的限制或者含有BLOB或TEXT欄位,那麼臨時表會轉換成MyISAM表。
上面介紹了三種,你如何選擇儲存引擎呢:
-
事務 :目前只有Innodb能完美的支援事務。
-
備份 :只有Innodb有免費的線上熱備方案,mysqldump不算線上熱備的方案,它需要對資料加鎖。
-
崩潰恢復:myisam表由於系統崩潰導致資料損壞的概率比Innodb高跟很多,而且恢復速度也沒有innodb快。
-
特有的特性:如需要聚簇索引,那就需要選擇innodb儲存引擎,有的需要使用地理空間搜尋,那就選擇myisam 。
mysql的儲存引擎有很多,這裡主要介紹了以上3中,其中InnoDB是現在使用最廣泛也是預設的儲存引擎,如果沒有特殊需求使用預設的即可,也就是InnoDB。後面有文章詳解InnoDB.