Mysql索引(索引資料結構和分類)

2021-10-23 07:12:33 字數 3800 閱讀 5595

索引在物理上的區分

聯合索引

mysql索引是一種資料結構,一種加快資料庫查詢的資料結構。(來自於尚矽谷的mysql高階)

當然,形象的理解就是一本字典的目錄,目錄又分兩種。一種拼音的,一種偏旁的。這個說這個因為後面有用。

在我們設定mysql索引時,可以選擇索引型別為唯一索引,普通索引和主鍵索引。唯一索引的意思就是在建立索引的字段上不能有重複的內容,必須為唯一的(可以為空值)。普通索引沒這個要求,普通索引可以有重複的內容(可以有空值)。但是建議索引放在重複內容不多的字段上,重複內容多的建立索引沒意義。主鍵索引就是我們建立主鍵的字段上的索引(不能為空值且唯一),如果為多個主鍵,那麼就會是聯合索引。

索引的資料結構我們可以選擇btree,hash。

這裡說的btree是b+樹,他首先是乙個平衡樹,相比於紅黑樹不同在於他的每個除去葉子節點的其他節點有數量大於2的兒子節點。即b+樹可以每個節點儲存更多的資訊,減少查詢次數。b+樹的所有葉子節點會用乙個鍊錶鏈結起來,這樣可以更方便的遍歷所有葉子節點。

hash是通過將索引欄位先進行雜湊值計算,然後過一定的隱射演算法將雜湊值和儲存空間對應起來。由於雜湊值獨特的計算和表達方式,雜湊值是無序的,導致在使用範圍查詢和order by時不能使用到hash索引。但是雜湊的優點在於不用像btree那樣每次查詢都需要從根節點開始,而是直接計算雜湊值後通過對映找到資料。所示在等值查詢上雜湊比btree方便。但是由於其他缺陷,所以我們使用hash很少,大多就是用btree。

我們這裡說的btree指的是b+樹。當然了解b+樹還是得先了解b樹。

b樹的特點

b樹首先比2叉樹包含更多的節點,不只只是2個節點。所以乙個b樹在更少的層級可以儲存更多的資訊,所以很多作業系統在儲存檔案資訊時都用b樹,這樣可以經過更少的路徑來獲取到想要的結果。

一棵m階的b 樹 (注:切勿簡單的認為一棵m階的b樹是m叉樹,雖然存在四叉樹,八叉樹,kd樹,及vp/r樹/r*樹/r+樹/x樹/m樹/線段樹/希爾伯特r樹/優先r樹等空間劃分樹,但與b樹完全不等同)的特性如下:

樹中每個結點最多含有m個孩子(m>=2);

除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子(其中ceil(x)是乙個取上限的函式);

若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點為葉子結點,整棵樹只有乙個根節點);

所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字資訊(可以看做是外部接點或查詢失敗的接點,實際上這些結點不存在,指向這些結點的指標都為null)。

每個非終端結點中包含有n個關鍵字資訊: (n,p0,k1,p1,k2,p2,…,kn,pn)。其中:

a) ki (i=1…n)為關鍵字,且關鍵字按順序公升序排序k(i-1)< ki。

b) pi為指向子樹根的接點,且指標p(i-1)指向子樹種所有結點的關鍵字均小於ki,但都大於k(i-1)。

c) 關鍵字的個數n必須滿足: [ceil(m / 2)-1]<= n <= m-1。

例如乙個m為3的b樹,那麼他的每個節點最多有3棵子樹(第一條)。最少也含有2棵子樹(第二條)。如果根節點不是葉子節點,那麼應該至少有2棵子樹(第三條)。所有葉子節點都在同一層,但是葉子節點不包含任何關鍵字資訊。每個非終端節點包含n個關鍵字資訊,有(n,p0,k1,p1,k2,p2),其中k1和k2為關鍵字,p0小於k1,p1大於k1但是小於k2,p2大於k2。1<=n<=2。也就是k的下標n的取值。

畫個圖來表示一下

m=3

20/ \

8 15 26 31

/ | \

4 13 19

其中8和15就是k1和k2,下面的/|\就是p1,p2和p3,指向子樹。當然26和31下面也應該有三個子樹。只是這裡不方便畫出來。

b+樹的特點

父結點只起索引查詢的作用,資料都存在最後的葉子節點中,同時所葉子結點也也構成了一條有序的鍊錶。

mysql中儲存引擎為innodb的索引,採用的資料結構即是b+樹。

特點:a)有m個子結點的父結點就有m個關鍵字(在b樹中是m-1);

b)所有葉子結點包含了所有關鍵字(值)(b樹不包含,子節點都不包含父節點的,別說最下面的葉子節點了),且構成由小到大的有序鍊錶(所有葉子節點串成一串。);

c) 所有非葉子結點起索引作用(沒有資料在該類節點上),結點僅包含子樹所有結點的最大值(即乙個節點關鍵字為(15, 21, 34),那麼他的最左邊子樹的最大為15,中間子樹最大為21,右邊子樹最大為34);

稠密索引的意思為所有索引都儲存在物理裝置上,而稀疏所以只儲存了部分索引。例如我們的id有1到10,我們的id中1到10全部儲存在了物理裝置上,可以是有序的也可以是無序的。這就是稠密索引。稀疏索引為只儲存了1,3,5,7,9而非全部的索引,稀疏索引也都是聚集索引,即有序的。

上面在稀疏索引上提到了聚集索引,因為稀疏索引是在儲存了一部分索引鍵,那麼我們只能找到這個索引所在的範圍。如果索引是無序的在物理儲存中存放的,那麼這個範圍毫無意義。所以稀疏索引必須是聚集索引。也就是索引儲存在物理儲存中是有序排列的。聚集索引在資料庫中最多只有乙個索引為聚集索引。在我們使用innodb作為儲存引擎時,我們的主鍵就是聚集索引。

聚簇索引的意思為我們的資料和索引是在一起的,非聚簇索引的意思為索引和資料不在一起。在一起的好處在於我們可以通過找到索引就能找到資料,缺點是索引表非常的大。在innodb引擎中,主鍵就為聚簇索引,其他的索引為非聚簇索引。在myasim引擎中索引為非聚簇索引。非聚簇索引儲存的是索引和該資料在物理儲存中的位置。找到索引後還需要去物理儲存中再次讀取資料。所以非聚簇索引在索引建立時需要更小的空間,但是查詢還需要多一次讀取。

在建立索引時還可能選擇多個字段作為聯合索引。聯合索引存在乙個最左匹配原則。比如說我們有a,b,c三個索引建立乙個聯合索引,並且順序按照我們當前寫的順序。

我們在使用該索引查詢內容時,我們也會按照abc的順序匹配索引。例如

select

*from *** where a=

1and b=

2and c=

3

這樣我們就可以使用到索引,當然,交換abc的順序也會使用到該索引,因為mysql在執行sql語句的時候會對語句進行優化。

如果我們只使用到部分索引,比如ac,ab,a這些組合情況。也是可以使用到索引的。但是ac只會匹配到a後,就會在查詢中進行索引掃瞄。也就是只能篩選出a,而c對mysql來說相對於a是無序的。c只相當於ac為有序。

還有情況就是我們使用like模糊查詢,那麼我們也是匹配到該模糊查詢的地方,並且like的模糊查詢在前面不能用萬用字元這些,舉例說明。

//只匹配到a

select

*from *** where a like

"***%"

and b =

1and c =1;

//啥也匹配不到,因為前面有萬用字元。

select

*from *** where a like

"%***"

and b =

1and c =

1;

最左匹配原則還有乙個匹配規則為匹配到第乙個範圍查詢就停止。即匹配到》,<,<=>,between xx and xx,等範圍查詢。舉例說明。

//只匹配到a就結束了

select

*from *** where a >

5and b=

1and c =2;

//只匹配到b就結束了

select

*from *** where a =

5and b>

1and c =

2;

因為後面的索引相當於前面這個索引的範圍查詢來說是無序的,只有進行索引掃瞄。

mysql索引資料結構 mysql索引資料結構

什麼是索引?索引就是排好序的資料結構,可以幫助我們快速的查詢到資料 幾種資料結構 二叉樹 如果資料是單邊增長的情況 那麼出現的就是和鍊錶一樣的資料結構了,樹高度大 紅黑樹 在二叉樹的基礎上多了樹平衡,也叫二叉平衡樹,不像二叉樹那樣極端的情況會往乙個方向發展。同樣我們查詢6,在二叉樹中我們需要經過6個...

MySQL索引及索引資料結構

索引是幫助mysql高效獲取資料的排好序的資料結構 索引分類 索引失效的情況 模糊查詢時,第乙個查詢字元是不確定值 或 時,索引失效 select name from stu where name like e 索引失效 select name from stu where name like h ...

MySQL索引資料結構

mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構。句子主幹就是索引是資料結構。資料庫查詢是資料庫的主要功能,我們都希望查詢資料的速度盡可能快,因此資料庫系統設計會從查詢的優化的角度進行優化。最基本的查詢演算法就是順序查詢,但這種複雜度為o n 查詢在資料量大的時...