1. 程式人生 > 其它 >mysql進階系列:mysql的儲存引擎有什麼區別,該怎麼選擇

mysql進階系列:mysql的儲存引擎有什麼區別,該怎麼選擇

本文mysql實驗版本 : 5.7.21

基礎架構篇瞭解到執行器執行這個執行計劃,通過呼叫儲存引擎的API來操作資料。

mysql提供了一系列儲存引擎的API,所有的儲存引擎都要符合API要求,因此可以實現這種外掛式的儲存引擎,可以根據不同的需求選擇合適的儲存引擎(就像握推槓鈴一樣,可以按需選擇不同大小的槓鈴片,嗯對的)。

儲存引擎是針對表的而不是庫,對於同一個庫不同的表可以使用不同的儲存引擎

常見的儲存引擎有 MyISAMInnoDBMemory

檢視當前資料支援的儲存引擎:

  1. 在新建表的時候可以選擇儲存引擎

CREATE TABLE  'user'  (
  'id
' bigint(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' ) ENGINE = MyISAM

ENGINE = MyISAM 代表這個表的儲存引擎是MyISAM 。

  1. 查看錶相關資訊,例如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.