亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL索引的實現原理是什么

發布時間:2021-06-24 17:15:34 來源:億速云 閱讀:179 作者:Leah 欄目:大數據

MySQL索引的實現原理是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

MyISAM 索引實現 

MyISAM 引擎使用 B+Tree 作為索引結構,葉節點的 data 域存放的是數據記錄的地址。下圖是 MyISAM 索引的原理圖:
MySQL索引的實現原理是什么

這里設表一共有三列,假設我們以 Col1 為主鍵,則圖 8 是一個 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件僅僅保存數據記錄的地址。

輔助索引 

在 MyISAM 中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求 key 是唯一的,而輔助索引的 key 可以重復。如果我們在 Col2 上建立一個輔助索引,則此索引的結構如下圖所示


MySQL索引的實現原理是什么

同樣也是一顆 B+Tree,data 域保存數據記錄的地址。因此,MyISAM 中索引檢索的算法為首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,則取出其data 域的值,然后以 data 域的值為地址,讀取相應數據記錄。

MyISAM 的索引方式也叫做“非聚集索引”,之所以這么稱呼是為了與 InnoDB的聚集索引區分。


InnoDB 索引實現 

雖然 InnoDB 也使用 B+Tree 作為索引結構,但具體實現方式卻與 MyISAM 截然不同。

1.第一個重大區別是 InnoDB 的數據文件本身就是索引文件。從上文知道,MyISAM 索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。

而在InnoDB 中,表數據文件本身就是按 B+Tree 組織的一個索引結構,這棵樹的葉點data 域保存了完整的數據記錄。這個索引的 key 是數據表的主鍵,因此 InnoDB 表數據文件本身就是主索引。


MySQL索引的實現原理是什么

上圖是 InnoDB 主索引(同時也是數據文件)的示意圖,可以看到葉節點包含了完整的數據記錄。這種索引叫做聚集索引。因為 InnoDB 的數據文件本身要按主鍵聚集,

 1 .InnoDB 要求表必須有主鍵(MyISAM 可以沒有),如果沒有顯式指定,則 MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL 自動為 InnoDB 表生成一個隱含字段作為主鍵,類型為長整形。

 同時,請盡量在 InnoDB 上采用自增字段做表的主鍵。因為 InnoDB 數據文件本身是一棵B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持 B+Tree 的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。如果表使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當前索引節點的后續位置,當一頁寫滿,就會自動開辟一個新的頁。如下圖所示:


MySQL索引的實現原理是什么

這樣就會形成一個緊湊的索引結構,近似順序填滿。由于每次插入時也不需要移動已有數據,因此效率很高,也不會增加很多開銷在維護索引上。

 2.第二個與 MyISAM 索引的不同是 InnoDB 的輔助索引 data 域存儲相應記錄主鍵的值而不是地址。換句話說,InnoDB 的所有輔助索引都引用主鍵作為 data 域。
例如,圖 11 為定義在 Col3 上的一個輔助索引:


MySQL索引的實現原理是什么
 

聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

 引申:為什么不建議使用過長的字段作為主鍵?

 因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。


聚簇索引與非聚簇索引 

InnoDB 使用的是聚簇索引, 將主鍵組織到一棵 B+樹中, 而行數據就儲存在葉子節點上, 若使用"where id = 14"這樣的條件查找主鍵, 則按照 B+樹的檢索算法即可查找到對應的葉節點, 之后獲得行數據。若對 Name 列進行條件搜索, 則需要兩個步驟:
第一步在輔助索引 B+樹中檢索 Name, 到達其葉子節點獲取對應的主鍵。
第二步使用主鍵在主索引 B+樹種再執行一次 B+樹檢索操作, 最終到達葉子節點即可獲取整行數據。

MyISM 使用的是非聚簇索引, 非聚簇索引的兩棵 B+樹看上去沒什么不同, 節點
的結構完全一致只是存儲的內容不同而已, 主鍵索引 B+樹的節點存儲了主鍵, 輔助鍵索引B+樹存儲了輔助鍵。表數據存儲在獨立的地方, 這兩顆 B+樹的葉子節點都使用一個地址指向真正的表數據, 對于表數據來說, 這兩個鍵沒有任何差別。由于索引樹是獨立的, 通過輔助鍵檢索無需訪問主鍵的索引樹。

為了更形象說明這兩種索引的區別, 我們假想一個表如下圖存儲了 4 行數據。其中Id 作為主索引, Name 作為輔助索引。圖示清晰的顯示了聚簇索引和非聚簇索引的差異


MySQL索引的實現原理是什么

聯合索引及最左原則

聯合索引存儲數據結構圖:

MySQL索引的實現原理是什么

最左原則:

例如聯合索引有三個索引字段(A,B,C)

查詢條件:

(A,,)---會使用索引

(A,B,)---會使用索引

(A,B,C)---會使用索引

(,B,C)---不會使用索引

(,,C)---不會使用索引

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长兴县| 浪卡子县| 衡阳县| 萨迦县| 蓝田县| 湖州市| 乌鲁木齐县| 巩义市| 大名县| 三门县| 璧山县| 札达县| 晋州市| 利津县| 泸溪县| 遂宁市| 宣恩县| 来凤县| 宁都县| 南康市| 资中县| 罗源县| 灯塔市| 泰宁县| 盐池县| 利川市| 鲁山县| 怀柔区| 黑水县| 大丰市| 昌吉市| 兴义市| 清徐县| 宜昌市| 额尔古纳市| 白河县| 霍邱县| 南岸区| 广宗县| 芦溪县| 巫山县|