mysql索引實現 mysql 索引是怎麼實現的?

2021-10-17 12:30:35 字數 1842 閱讀 4387

看了很多關於索引的部落格,講的大同小異。但是始終沒有讓我明白關於索引的一些概念,如b-tree索引,hash索引,唯一索引....或許有很多人和我一樣,沒搞清楚概念就開始研究b-tree,b+tree等結構,導致在面試的時候答非所問!本文中有關儲存引擎請檢視mysql儲存引擎-innodb和myisam

索引是什麼?

索引是幫助mysql高效獲取資料的資料結構。

索引能幹什麼?

提高資料查詢的效率。

索引:排好序的快速查詢資料結構!索引會影響where後面的查詢,和order by 後面的排序。

一、索引的分類#

1️⃣從儲存結構上來劃分:btree索引(b-tree或b+tree索引),hash索引,full-index全文索引,r-tree索引。

2️⃣從應用層次來分:普通索引,唯一索引,復合索引

3️⃣根據中資料的物理順序與鍵值的邏輯(索引)順序關係:聚集索引,非聚集索引。

​ 1️⃣中所描述的是索引儲存時儲存的形式,2️⃣是索引使用過程中進行的分類,兩者是不同層次上的劃分。不過平時講的索引型別一般是指在應用層次的劃分。

就像手機分類:安卓手機,ios手機 與 華為手機,蘋果手機,oppo手機一樣。

普通索引:即乙個索引只包含單個列,乙個表可以有多個單列索引

唯一索引:索引列的值必須唯一,但允許有空值

復合索引:即乙個索引包含多個列

聚簇索引(聚集索引):並不是一種單獨的索引型別,而是一種資料儲存方式。具體細節取決於不同的實現,innodb的聚簇索引其實就是在同乙個結構中儲存了b-tree索引(技術上來說是b+tree)和資料行。

非聚簇索引:不是聚簇索引,就是非聚簇索引(認真臉)。

二、索引的底層實現#

mysql預設儲存引擎innodb只顯式支援b-tree( 從技術上來說是b+tree)索引,對於頻繁訪問的表,innodb會透明建立自適應hash索引,即在b樹索引基礎上建立hash索引,可以顯著提高查詢效率,對於客戶端是透明的,不可控制的,隱式的。不談儲存引擎,只討論實現(抽象)

hash索引

基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼(hash code),並且hash索引將所有的雜湊碼儲存在索引中,同時在索引表中儲存指向每個資料行的指標。

b-tree索引(mysql使用b+tree)

​ b-tree能加快資料的訪問速度,因為儲存引擎不再需要進行全表掃瞄來獲取資料,資料分布在各個節點之中。

b+tree索引

​ 是b-tree的改進版本,同時也是資料庫索引索引所採用的儲存結構。資料都在葉子節點上,並且增加了順序訪問指標,每個葉子節點都指向相鄰的葉子節點的位址。相比b-tree來說,進行範圍查詢時只需要查詢兩個節點,進行遍歷即可。而b-tree需要獲取所有節點,相比之下b+tree效率更高。

結合儲存引擎來討論(一般預設使用b+tree)

案例:假設有一張學生表,id為主鍵idnamebirthday

在myisam引擎中的實現(二級索引也是這樣實現的)

在innodb中的實現

三、問題#

問:為什麼索引結構預設使用b-tree,而不是hash,二叉樹,紅黑樹?

hash:雖然可以快速定位,但是沒有順序,io複雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查詢效率跟資料有關(樹的高度),並且io代價高。

紅黑樹:樹的高度隨著資料量增加而增加,io代價高。

問:為什麼官方建議使用自增長主鍵作為索引。

結合b+tree的特點,自增主鍵是連續的,在插入過程中儘量減少頁**,即使要進行頁**,也只會**很少一部分。並且能減少資料的移動,每次插入都是插入到最後。總之就是減少**和移動的頻率。

插入連續的資料:

插入非連續的資料

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql主鍵索引 MySQL索引之主鍵索引

在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...

mysql聚集索引 MySQL索引之聚集索引介紹

在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...