myisam和innodb索引實現的不同

2021-07-17 03:07:51 字數 806 閱讀 9184

myisam引擎使用b+tree作為索引結構,葉節點的data域存放的是資料記錄的位址。下圖是myisam索引的原理圖:

myisam的索引方式也叫做「非聚集」的,之所以這麼稱呼是為了與innodb的聚集索引區分。

innodb索引實現

雖然innodb也使用b+tree作為索引結構,但具體實現方式卻與myisam截然不同。

第乙個重大區別是innodb的資料檔案本身就是索引檔案。從上文知道,myisam索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的位址。而在innodb中,表資料檔案本身就是按b+tree組織的乙個索引結構,這棵樹的葉節點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。

系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

第二個與myisam索引的不同是innodb的輔助索引data域儲存相應記錄主鍵的值而不是位址。換句話說,innodb的所有輔助索引都引用主鍵作為data域。例如,下圖為定義在col3上的乙個輔助索引:

了解不同儲存引擎的索引實現方式對於正確使用和優化索引都非常有幫助,例如知道了innodb的索引實現後,就很容易明白為什麼不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在innodb中不是個好主意,因為innodb資料檔案本身是一顆b+tree,非單調的主鍵會造成在插入新記錄時資料檔案為了維持b+tree的特性而頻繁的**調整,十分低效,而使用自增字段作為主鍵則是乙個很好的選擇。

mysql索引 Innodb和MyIsam引擎

mysql主要有兩大儲存引擎,innodb和myisam 兩大引擎的底層索引實現也有區別。innodb 主要是聚集索引和輔助索引 聚集索引,實現是將主鍵id作為索引,以b 樹的結構儲存,葉子節點儲存的是整條id以及其對應的表記錄,id唯一,每次通過id走索引直接查到對應的記錄,效率最高 輔助索引,以...

索引之innodb和myisam

innodb和myisam的diff 參考文章 what myisam 索引檔案和資料檔案是分開的。索引檔案中葉子結點的data部分,僅僅是資料記錄的位址。它的主索引和輔助索引在結構上沒有區別,資料上主索引的key是唯一的,輔助索引上的key可以重複。主索引 上圖中col1為主鍵,即該 primar...

Myisam索引和Innodb索引的區別

首先你要知道 無論是myisam和innodb引擎,如果在建表的時候沒有顯示的定義一行主鍵列的話,他內部都會自動建立乙個隱藏的主鍵索引 主鍵索引以外的索引假設稱為次索引 首先myisam和innodb兩個都是預設採用的btree索引,可以腦補一顆二叉樹 myisam引擎的資料在物理磁碟上是按照順序儲...