引言:
MySQL存儲引擎主要分為 InnoDB 存儲引擎與 MyISAM 存儲引擎。都采用B+數的存儲結構。
應用場景:
InnoDB適合:(1)可靠性要求比較高,要求事務;(2)大量 insert 和 update 。
MyISAM適合:(1)沒有事務。(2)插入不頻繁,大量 select 。
一、 InnoDB 存儲引擎
InnoDB 存儲引擎是MySQL 的默認事物型引擎,是使用最廣泛的存儲引擎,采用聚簇索引。
1.支持ACID的事務,支持事務的四種隔離級別。
2.支持行級鎖(默認),也支持表級索。
3. 主鍵索引采用聚簇索引(索引的數據域存儲數據文件本身key+行記錄),輔索引的數據域存儲主鍵的值;因此從輔索引查找數據,需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數據時,為維持B+樹結構,文件的大調整。
4. 不保存表的總行數
二、 MyISAM 存儲引擎
MyISAM 存儲引擎是MySQL最早的存儲引擎之一,采用非聚簇索引,沒有事物和行級鎖。MyISAM對整張表加鎖,讀取時加共享鎖,寫入時加排他鎖。
1. 不支持事物。
2. 支持表級鎖,不支持行級鎖。
3.采用非聚簇索引,索引文件的數據域存儲指向數據文件的指針。輔索引與主索引基本 一致,但是輔索引不用保證唯一性。
4. 保存總行數,MyISAM:select count(*) from table,MyISAM只要簡單的讀出保存好的行數,注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的
三、聚簇索引與非聚簇索引的區別
1. 聚簇索引的順序就是數據的物理存儲順序,所以一個表最多只能有一個聚簇索引。如InnoDB主索引。
2. 非聚集索引中的邏輯順序並不等同於表中行的物理順序,索引是指向表中行的位置的指針。如MyISAM 主索引與輔索引。
四、索引的實現
1. InnoDB 索引的實現
InnoDB 采用B+ 樹的存儲結構,樹的葉子節點保存了完整的數據記錄,該行記錄。
InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。
輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

圖1. 主索引

圖2. 輔索引
2. MyISAM 索引的實現
MyISAM 存儲引采用的是 B+ 樹的數據結構。
葉節點的data域存放的是數據記錄的地址。

圖3. 主鍵索引

圖4. 輔助索引
五、InnoDB 與 MyISAM 索引的區別
1. InnoDB 使用的是聚簇索引,將主鍵組織到一棵 B+樹中,而行數據就儲存在葉子節 點上,若使用"whereid=14"這樣的條件查找主鍵,則按照 B+樹的檢索算法即可查找到 對應的葉節點,之后獲得行數據。若對 Name 列進行條件搜索,則需要兩個步驟:第一步 在輔助索引 B+樹中檢索 Name,到達其葉子節點獲取對應的主鍵。第二步使用主鍵在主 索引 B+樹種再執行一次 B+樹檢索操作,最終到達葉子節點即可獲取整行數據。
2. MyISM 使用的是非聚簇索引,非聚簇索引的兩棵 B+樹看上去沒什么不同,節點 的結構完全一致只是存儲的內容不同而已,主鍵索引 B+樹的節點存儲了主鍵,輔助鍵索引 B+樹存儲了輔助鍵。表數據存儲在獨立的地方,這兩顆 B+樹的葉子節點都使用一個地址 指向真正的表數據,對於表數據來說,這兩個鍵沒有任何差別。由於索引樹是獨立的,通
過輔助鍵檢索無需訪問主鍵的索引樹。
為了更形象說明這兩種索引的區別,我們假想一個表如下圖存儲了 4 行數據。其中 Id 作為主索引,Name 作為輔助索引。圖示清晰的顯示了聚簇索引和非聚簇索引的差異。

