深入瞭解數據庫存儲引擎

深入瞭解數據庫存儲引擎

數據庫存儲引擎

MySQL中索引屬於存儲引擎級別的概念,不同存儲引擎對索引的實現方式是不同的。

一、MyISAM

MyISAM引擎是MySQL5.5.8版本之前默認的存儲引擎,不支持事物,支持全文檢索使用B+Tree作爲索引結構,葉節點的data域存放的是數據記錄的地址,其結構如下:

在這裏插入圖片描述

上圖是以以Col1爲主鍵,MyISAM的示意圖,可以看出MyISAM的索引文件僅僅保存數據記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。如果想在Col2上建立一個輔助索引,則此索引的結構如下圖所示:

在這裏插入圖片描述

同樣也是一棵B+Tree,data域保存數據記錄的地址。因此,MyISAM中索引檢索的算法爲首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然後以data域的值爲地址,讀取相應數據記錄。MyISAM的索引方式也叫做“非聚集索引”的。

二、InnoDB

InnoDB存儲引擎支持事務,其設計目標主要面向在線事務處理的應用,從MySQL數據庫5.5.8版本開始,InnoDB存儲引擎是默認的存儲引擎InnoDB支持B+樹索引、全文索引、哈希索引。但InnoDB使用B+Tree作爲索引結構時,具體實現方式卻與MyISAM截然不同。
第一個區別是InnoDB的數據文件本身就是索引文件。MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而InnoDB索引,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。
在這裏插入圖片描述
上圖是InnoDB主索引(同時也是數據文件)的示意圖,可以看到葉節點包含了完整的數據記錄,這種索引叫做聚集索引。因爲InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作爲主鍵,如果不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段作爲主鍵,這個字段長度爲6個字節,類型爲長整形。

第二個區別是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址,所有輔助索引都引用主鍵作爲data
域。
在這裏插入圖片描述
聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

注意:對於InnoDB表,自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列,但是對於MyISAM表,自動增長列可以是組合索引的其他列,這樣插入記錄後,自動增長列是按照組合索引到前面幾列排序後遞增的。

存儲引擎的對比

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章