b樹索引適用儲存引擎如表所示:
索引/儲存引擎
myisam
innodb
memory
b-tree索引
支援支援
支援
tips mysql官方只有b+樹的概念,b樹是國內的叫法,mysql官方的b樹即國內的b+樹下圖是myisam索引的原理圖。即使多個儲存引擎支援同一種型別的索引,但是他們的實現原理也是不同的。innodb和mylisam預設的索引是btree索引;而memory預設的索引是hash索引。
myisam引擎使用
b+tree
作為索引結構,葉子節點的data域存放的是資料記錄的位址
。
我們知道innodb中索引即資料
,也就是聚簇索引的那棵b+樹的葉子節點中已經把所有完整的使用者記錄都包含了,而myisam
的索引方案雖然也使用樹形結構,但是卻將索引和資料分開儲存
︰
● 將表中的記錄按照記錄的插入順序
單獨儲存在乙個檔案中,稱之為資料檔案。這個檔案並不劃分為若干個資料頁,有多少記錄就往這個檔案中塞多少記錄就成了。由於在插入資料的時候並沒有刻意按照主鍵大小排序,所以我們並不能在這些資料上使用二分法進行查詢。
● 使用myisam
儲存引擎的表會把索引資訊另外儲存到乙個稱為索引檔案
的另乙個檔案中。myisam
會單獨為表的主鍵建立乙個索引,只不過在索引的葉子節點中儲存的不是完整的使用者記錄,而是主鍵值+資料記錄位址
的組合。
這裡設表一共有三列,假設我們以col1為主鍵,上圖是乙個myisam表的主索引(primary key)示意。可以看出mylsam的索引檔案僅僅儲存資料記錄的位址
。在mylisam中,主鍵索引和二級索引(secondary key)在結構上沒有任何區別,只是主鍵索引要求key是唯一的,而二級索引的key可以重複。如果我們在col2上建立乙個二級索引,則此索引的結構如下圖所示:
同樣也是一棵b+tree,data域儲存資料記錄的位址。因此,myisam中索引檢索的演算法為:首先按照b+tree搜尋演算法搜尋索引,如果指定的key存在,則取出其data域的值,然後以data域的值為位址,讀取相應資料記錄。
myisam的索引方式都是「非聚簇」的,與innodb包含乙個聚簇索引是不同的。小結兩種引擎中索引的區別:
①在innodb儲存引擎中,我們只需要根據主鍵值對聚簇索引
進行一次查詢就能找到對應的記錄,而在myisam
中卻需要進行一次回表
操作,意味著mylsam中建立的索引相當於全部都是二級索引
。
②innodb的資料檔案本身就是索引檔案,而myisam索引檔案和資料檔案是分離的
,索引檔案僅儲存資料記錄的位址。
③innodb的非聚簇索引data域儲存相應記錄主鍵的值
,而myisam索引記錄的是位址
。換句話說,innodb的所有非聚簇索引都引用主鍵作為data域。
④ myisam的回表操作是十分快速
的,因為是拿著位址偏移量直接到檔案中取資料的,反觀innodb是通過獲取主鍵之後再去聚簇索引裡找記錄,雖然說也不慢,但還是比不上直接用位址去訪問。
⑤innodb要求表必須有主鍵
(myisam可以沒有
)。如果沒有顯式指定,則mysql系統會自動選擇乙個可以非空且唯一標識資料記錄的列作為主鍵。如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整型。
小結:
了解不同儲存引擎的索引實現方式對於正確使用和優化索引都非常有幫助。比如:
舉例1:知道了innodb的索引實現後,就很容易明白為什麼不建議使用過長的字段作為主鍵
,因為所有二級索引都引用主鍵索引,過長的主鍵索引會令二級索引變得過大。
舉例2:用非單調的字段作為主鍵在innodb中不是個好主意,因為innodb資料檔案本身是一棵b+tree,非單調的主鍵會造成在插入新記錄時,資料檔案為了維持b+tree的特性而頻繁的**調整,十分低效,而使用自增字段作為主鍵則是乙個很好的選擇
。
Myisam索引和Innodb索引的區別
首先你要知道 無論是myisam和innodb引擎,如果在建表的時候沒有顯示的定義一行主鍵列的話,他內部都會自動建立乙個隱藏的主鍵索引 主鍵索引以外的索引假設稱為次索引 首先myisam和innodb兩個都是預設採用的btree索引,可以腦補一顆二叉樹 myisam引擎的資料在物理磁碟上是按照順序儲...
MyISAM 索引結構了解
myisam 儲存引擎索引的基本儲存結構。從索引基本的存放資料結構來說,myisam 的索引不論是 primary key 還是普通 index,儲存結構都基本一樣,基本結構都是 balance tree 簡稱為 b tree 所有的鍵值詳細資訊和行 指標 資訊都存放於 b tree 的 leaf ...
MyISAM和InnoDB的索引實現
在 mysql 中,主要有四種型別的索引,分別為 b tree 索引,hash 索引,fulltext 索引和 r tree 索引。我們主要分析b tree 索引。b tree 索引是 mysql 資料庫中使用最為頻繁的索引型別,除了 archive 儲存引擎之外的其他所有的儲存引擎都支援 b tr...