索引定義:是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。
索引是物理資料頁儲存,在資料檔案中(innodb,ibd檔案),利用資料頁(page)儲存。
索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。
索引涉及的理論知識:二分查詢法、hash和b+tree。
一、二分查詢法
二分查詢法也叫這邊查詢法,它是在有序陣列中查詢指定資料的搜尋演算法。其有點事等值查詢、範圍查詢效能高,缺點是更新資料、新增資料、刪除資料維護成本高。
1)定位left和right兩個指標;
2)計算(left+right)/2;
3)判斷除以2後索引位置值與模板值的大小比對;
4)索引位置值大於目標值就-1, right移動;如果小於目標值就+1, left移動。
具體演算法可參考演算法之線性表查詢技術 - 池塘裡洗澡的鴨子 - (cnblogs.com)
二、hash結構
hash底層實現是由hash表來實現的,是根據鍵值 儲存資料的結構。非常適合根據key查詢
value值,也就是單個key查詢,或者說等值查詢。其結構如下所示:
從上面結構可以看出,hash索引可以方便的提供等值查詢,但是對於範圍查詢就需要全表掃瞄了。
hash索引在mysql 中hash結構主要應用在memory原生的hash索引 、innodb 自適應雜湊索引。
innodb提供的自適應雜湊索引功能強大,接下來重點描述下innodb 自適應雜湊索引。
innodb自適應雜湊索引是為了提公升查詢效率,innodb儲存引擎會監控表上各個索引頁的查詢,
當innodb注意到某些索引值訪問非常頻繁時,會在記憶體中基於b+tree索引再建立乙個雜湊索引,使得內
存的 b+tree 索引具備雜湊索引的功能,即能夠快速定值訪問頻繁訪問的索引頁。
innodb自適應雜湊索引:在使用hash索引訪問時,一次性查詢就能定位資料,等值查詢效率要優於
b+tree。
自適應雜湊索引的建立使得innodb儲存引擎能自動根據索引頁訪問的頻率和模式自動地為某些熱點頁
建立雜湊索引來加速訪問。另外innodb自適應雜湊索引的功能,使用者只能選擇開啟或關閉功能,無法
進行人工干涉。
三、b+tree結構
mysql資料庫索引採用的是b+tree結構,在b-tree結構上做了優化改造。
1、b-tree結構
1)索引值和data資料分布在整棵樹結構中
2)每個節點可以存放多個索引值及對應的data資料
3)樹節點中的多個索引值從左到右公升序排列
b樹的搜尋:從根節點開始,對節點內的索引值序列採用二分法查詢,如果命中就結束查詢。沒有
命中會進入子節點重複查詢過程,直到所對應的的節點指標為空,或已經是葉子節點了才結束。
2、b+tree結構
1)非葉子節點不儲存data資料,只儲存索引值,這樣便於儲存更多的索引值
2)葉子節點包含了所有的索引值和data資料
3)葉子節點用指標連線,提高區間的訪問效能
相比b樹,b+樹進行範圍查詢時,只需要查詢定位兩個節點的索引值,然後利用葉子節點的指標進
行遍歷即可。而b樹需要遍歷範圍內所有的節點和資料,顯然b+tree效率高。
具體可參考演算法之樹結構查詢技術 - 池塘裡洗澡的鴨子 - (cnblogs.com)。
四、聚族索引和輔助索引
聚簇索引和非聚簇索引:b+tree的葉子節點存放主鍵索引值和行記錄就屬於聚簇索引;如果索引值和行記錄分開存放就屬於非聚簇索引。
主鍵索引和輔助索引:b+tree的葉子節點存放的是主鍵字段值就屬於主鍵索引;如果存放的是非主鍵值就屬於輔助索引(二級索引)。
在innodb引擎中,主鍵索引採用的就是聚簇索引結構儲存。
1、聚簇索引(聚集索引)
聚簇索引是一種資料儲存方式,innodb的聚簇索引就是按照主鍵順序構建 b+tree結構。b+tree
的葉子節點就是行記錄,行記錄和主鍵值緊湊地儲存在一起。 這也意味著 innodb 的主鍵索引就
是資料表本身,它按主鍵順序存放了整張表的資料,占用的空間就是整個表資料量的大小。通常說
的主鍵索引就是聚集索引。
innodb的表要求必須要有聚簇索引:
如果表定義了主鍵,則主鍵索引就是聚簇索引;
如果表沒有定義主鍵,則第乙個非空unique列作為聚簇索引,
否則innodb會從建乙個隱藏的row-id作為聚簇索引
2、輔助索引
innodb輔助索引,也叫作二級索引,是根據索引列構建 b+tree結構。但在 b+tree 的葉子節點中
只存了索引列和主鍵的資訊。二級索引占用的空間會比聚簇索引小很多, 通常建立輔助索引就是
為了提公升查詢效率。乙個表innodb只能建立乙個聚簇索引,但可以建立多個輔助索引。
3、非聚簇索引
與innodb表儲存不同,myisam資料表的索引檔案和資料檔案是分開的,被稱為非聚簇索引結構。
mysql 索引原理
b樹 b樹高度 資料庫為什麼使用這種結構?一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i o消耗,相對於記憶體訪問,i o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟...
MySQL索引原理
對於現在網際網路對資料庫的操作,都是查詢的使用比較多,雖說是使用了各種快取技術來儲存從資料看讀取的資料,但是資料在不停地更新,還是要不停地查詢資料庫,但是在查詢資料庫的時候對於io消耗特別大,所以能把查詢的io的操作次數降低,那對於資料庫的效能提公升是很明顯的,因此b tree就出現了 對於b tr...
Mysql 索引原理
普通索引index 唯一索引 主鍵索引primary key 唯一索引unique 聯合索引 聯合主鍵索引primary key id,name 聯合唯一索引unique id,name 聯合普通索引index id,name 通常使用b 樹來實現的索引,示例如下 1 非葉子節點僅儲存索引,不儲存任...