MYSQL 基礎 索引原理

2022-03-10 23:52:45 字數 1937 閱讀 7338

資料庫索引是儲存在磁碟上的,當資料量比較大的時候,索引的大小將會達到幾個g。當我們利用索引查詢的時候,無法把整個索引全部載入到記憶體中。而是逐一載入每乙個磁碟頁,這裡的磁碟頁對應索引樹的結點。

b-樹,一種平衡多路查詢樹。適用於查詢磁碟中的大量資料。為了減少io次數,b樹最明顯的特徵是「矮胖的」,即深度較小。初次之外,還有如下特徵:

b樹每個節點可以有多個子樹,m階b樹表示該數每個節點最多有m個子樹

根節點至少有兩個子樹;中間節點都包含k-1個關鍵字,和k個子樹,其中(m/2<=k<=m)。

所有的葉子節點都在同一層。

每個節點中的元素從小達到排序,節點當中k-1個關鍵字正好被k個子樹包含的元素的值域分劃。

注:b-樹(中間的不是減),b是balance的意思。

3階b-樹

如下圖所示是乙個3階的b樹。

當單一節點中的關鍵字更多時,查詢的比較次數會更多,但是可以減少io讀寫次數。在這裡我們需要知道的是在記憶體中的比較耗時機會可以忽略,io次數足夠小,就可以提公升查詢效能

b+樹是基於b-樹的一種變體,有著比b-樹更高的查詢效能。b+樹具有如下特徵:

有k個子樹的中間節點包含有k個關鍵字(b樹中是k-1個關鍵字),每個關鍵字不儲存資料,只用來索引,所有資料都儲存在葉子節點

所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結。

所有的中間節點關鍵字都同時存在於子節點,在子節點關鍵字中是最大(或最小)元素。

概念有點晦澀,我們看乙個例子。

最明顯的特點就是中間節點的關鍵字全部都會包含在在葉子節點中,所以中間節點的關鍵字只是做索引,不儲存資料。每乙個葉子節點都帶有指向下乙個節點的指標,形成乙個有序鍊錶

快在**

b+樹的好處主要體現在查詢效能上。由於中間節點不儲存資料,所以同樣大小的磁碟頁可容納更多的關鍵字。這意味著,資料量相同的情況下,b+樹比b樹更矮胖,io查詢次數越少。同時b+樹查詢效能更加穩定,因為b樹匹配的關鍵字可能在葉子節點也可能在中間節點,而b+樹一定在葉子節點上。其次在範圍查詢上,由於葉子節點之間形成有序鍊錶所以速度更快

建索引的原則

慢查詢優化例項

如下查詢語句

select

count(*)

from

task

where

status=2

and operator_id=20839

and operate_time>1371169729

and operate_time<1371174603

and type=2;

根據最左匹配原則,最開始的sql語句的索引應該是status、operator_id、type、operate_time的聯合索引;其中status、operator_id、type的順序可以顛倒。

但是這只是一種語句,我們其實需要把這個表所有查詢都找到,進行綜合定奪。

MySQL索引原理之索引原理

索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 hash和b tree...

mysql索引基礎 Mysql 索引基礎

什麼是索引?為什麼要建立索引?索引,其實就是目錄。索引,用於快速找出在某個列中有某個特定值的行。不使用索引,mysql必須從第一條記錄開始查詢整張表,直到找出相關的行,那麼表越大,查詢資料所花費的時間就越多。假如表中查詢的列有乙個索引 目錄 mysql能夠快速定位到達乙個位置去搜尋資料檔案,而不必查...

mysql索引 mysql索引實現原理

什麼是索引 索引是一種高效獲取資料的儲存結構,例 hash 二叉 紅黑。mysql為什麼不用上面三種資料結構而採用b tree 若僅僅是 select from table where id 45 上面三種演算法可以輕易實現,但若是select from table where id 6 就不好使了...