mysql的索引檔案 MySQL索引實現

2021-10-17 12:04:03 字數 1679 閱讀 1735

摘自:

在mysql中,索引屬於儲存引擎級別的概念,不同儲存引擎對索引的實現方式是不同的,本文主要討論myisam和innodb兩個儲存引擎的索引實現方式。

myisam索引實現

圖8這裡設表一共有三列,假設我們以col1為主鍵,則圖8是乙個myisam表的主索引(primary key)示意。可以看出myisam的索引檔案僅僅儲存資料記錄的位址。在myisam中,主索引和輔助索引(secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。如果我們在col2上建立乙個輔助索引,則此索引的結構如下圖所示:

圖9同樣也是一顆b+tree,data域儲存資料記錄的位址。因此,myisam中索引檢索的演算法為首先按照b+tree搜尋演算法搜尋索引,如果指定的key存在,則取出其data域的值,然後以data域的值為位址,讀取相應資料記錄。

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

innodb索引實現

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

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

圖10圖10是innodb主索引(同時也是資料檔案)的示意圖,可以看到葉節點包含了完整的資料記錄。這種索引叫做聚集索引。因為innodb的資料檔案本身要按主鍵聚集,所以innodb要求表必須有主鍵(myisam可以沒有),如果沒有顯式指定,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

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

圖11這裡以英文本元的ascii碼作為比較準則。聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

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

mysql載入索引檔案格式 Mysql索引型別

圖示中左邊為clustered 形式存放的primary key,右側則為普通的b tree 索引。兩種索引在root node 和branch nodes 方面都還是完全一樣的。而leaf nodes 就出現差異了。在primary key中,leaf nodes 存放的是表的實際資料,不僅僅包括...

mysql檢視索引檔案內容 mysql的索引內容

1.索引的作用主要是加速查詢 2.索引的的分類有幾類分別為主鍵索引,唯一索引,普通索引和聯合索引 主鍵索引 主要是主鍵的作用,主鍵不能為空且不能重複,最後有加速查詢的功能 唯一索引 它分為兩部分,乙個是唯一約束,乙個是索引,普通索引 它就是加速查詢,對資料沒有什麼要求,聯合索引 把多列組合成乙個整體...

索引檔案構成

1 索引檔案 索引檔案由主檔案和索引表構成。主檔案 檔案本身。索引表 在檔案本身外建立的一張表,它指明邏輯記錄和物理記錄之間的一一對應關係。2 索引表組成 索引表必須按主關鍵字有序,而主檔案本身則可以按主關鍵字有序或無序。3 索引順序檔案和索引非順序檔案 1 索引順序檔案 indexed seque...