共計 1472 個字符,預計需要花費 4 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
丸趣 TV 小編給大家分享一下 MyISAM 與 InnoDB 索引實現的對比分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
MyISAM 索引實現
MyISAM 引擎使用 B +Tree 作為索引結構,葉節點的 data 域存放的是數據記錄的地址。如圖:
這里設表一共有三列,假設我們以 Col1 為主鍵,則上圖是一個 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件僅僅保存數據記錄的地址。在 MyISAM 中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求 key 是唯一的,而輔助索引的 key 可以重復。如果我們在 Col2 上建立一個輔助索引,則此索引的結構如下圖所示:
同樣也是一顆 B +Tree,data 域保存數據記錄的地址。因此,MyISAM 中索引檢索的算法為首先按照 B +Tree 搜索算法搜索索引,如果指定的 Key 存在,則取出其 data 域的值,然后以 data 域的值為地址,讀取相應數據記錄。
MyISAM 的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與 InnoDB 的聚集索引區分。
InnoDB 索引實現
雖然 InnoDB 也使用 B +Tree 作為索引結構,但具體實現方式卻與 MyISAM 截然不同。
第一個重大區別是 InnoDB 的數據文件本身就是索引文件。從上文知道,MyISAM 索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在 InnoDB 中,表數據文件本身就是按 B +Tree 組織的一個索引結構,這棵樹的葉節點 data 域保存了完整的數據記錄。這個索引的 key 是數據表的主鍵,因此 InnoDB 表數據文件本身就是主索引。
上圖是 InnoDB 主索引(同時也是數據文件)的示意圖,可以看到葉節點包含了完整的數據記錄。這種索引叫做聚集索引。因為 InnoDB 的數據文件本身要按主鍵聚集,所以 InnoDB 要求表必須有主鍵(MyISAM 可以沒有),如果沒有顯式指定,則 MySQL 系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則 MySQL 自動為 InnoDB 表生成一個隱含字段作為主鍵,這個字段長度為 6 個字節,類型為長整形。
第二個與 MyISAM 索引的不同是 InnoDB 的輔助索引 data 域存儲相應記錄主鍵的值而不是地址。換句話說,InnoDB 的所有輔助索引都引用主鍵作為 data 域。例如,下圖為定義在 Col3 上的一個輔助索引:
這里以英文字符的 ASCII 碼作為比較準則。聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
總結
在數據庫開發中,了解不同存儲引擎的索引實現方式對于正確使用和優化索引都非常有幫助。例如,知道了 InnoDB 的索引實現后,就很容易明白為什么不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在 InnoDB 中不是個好做法,因為 InnoDB 數據文件本身是一顆 B +Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持 B +Tree 的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。
以上是“MyISAM 與 InnoDB 索引實現的對比分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!
向 AI 問一下細節