1)主鍵索引:
MyISAM引擎使用B+Tree作為索引結構,葉節點的data領域存放的是數據記錄的位址。下圖為MyISAM主鍵指數 為為主鍵,圖myisam1是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引檔案僅保存資料記錄的位址。
2)輔助索引(Secondary key)
如果我們在Col2上建立一個輔助索引,則此索引的結構如下圖所示:
同樣也是一顆B+Tree,data域保存資料記錄的位址。因此,
MyISAM中索引檢索的演算法為首先依照B+Tree搜尋演算法搜尋索引,如果指定的Key存在,則取出其data域的值,然後以data域的值為位址,讀取對應資料記錄。
MyISAM的索引方式也叫做「非聚集」的,之所以這麼稱呼是為了與InnoDB的聚集索引區分。
2. InnoDB索引實作然InnoDB也使用B+Tree作為索引結構,但具體實作方式卻與MyISAM截然不同.
1)主鍵索引:
MyISAM索引檔案與資料檔案是分開的,並在索引檔案中只儲存資料記錄的位址。而在InnoDB中,表格資料檔案本身就是依照B+Tree組織的索引結構,這棵樹的葉節點data域保存了完整的資料記錄。這個索引的key是資料表的主鍵,因此InnoDB表資料檔本身就是主索引。
(圖inndb主鍵索引)是InnoDB主索引(同時也是資料檔)的示意圖,可以看到葉節點包含了完整的資料記錄。這種索引叫做聚集索引。因為InnoDB的資料檔案本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有明確指定,則MySQL系統會自動選擇一個可以唯一標識資料記錄的資料列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表產生一個隱含欄位作為主鍵,這個欄位長度為6個位元組,類型為長整形。
2). InnoDB的輔助索引
InnoDB的所有輔助索引都會引用主鍵為data域。例如,下圖為定義在Col3上的輔助索引:
InnoDB 表是基於聚集索引所建立的。因此InnoDB 的索引能提供非常快速的主鍵查找效能。不過,它的輔助索引(Secondary Index, 也就是非主鍵索引)也會包含主鍵列,所以,如果主鍵定義的比較大,其他索引也會很大。如果想在表上定義 、很多索引,則爭取盡量把主鍵定義得小一些。 InnoDB 不會壓縮索引。
文字字元的ASCII碼作為比較準則。 聚集索引這種實作方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:先擷取輔助索引取得主鍵,然後用主鍵到主鍵中擷取取得記錄。
不同儲存引擎的索引實作方式對於正確使用和最佳化索引都非常有幫助,例如知道了InnoDB的索引實作後,就很容易明白為什麼不建議使用過長的欄位作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會讓輔助索引變得過大。再例如,用非單調的欄位作為主鍵在InnoDB中不是個好主意,因為InnoDB資料檔本身就是一顆B+Tree,非單調的主鍵會造成在插入新記錄時資料檔為了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。
InnoDB索引和MyISAM索引的區別:
一是主索引的區別,InnoDB的資料檔案本身就是索引文件。而MyISAM的索引和資料是分開的。
二是輔助索引的區別:InnoDB的輔助索引data域儲存對應記錄主鍵的值而不是位址。而MyISAM的輔助索引和主索引沒有太大差別。
MySql索引演算法原理解析(簡單易懂,只講B-tree)
以上是MyISAM和InnoDB儲存引擎的索引實作方式的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!