MYSQL初窺索引1 索引原理

2021-10-07 00:03:39 字數 2692 閱讀 1031

mysql在進行千萬級別資料查詢時,如果沒用到索引,就需要遍歷整個資料表,來一一匹配結果是否滿足查詢調節,運氣好的時候匹配幾次就匹配到了,運氣不好時候就需要匹配很久,我們資料庫的資料都是儲存在磁碟中的,這樣一次次讀取磁碟資料到記憶體中匹配,會導致磁碟檔案的i/o效率很低,所以這時經常會使索引來加快查詢速度,這也是優化sql的乙個重要手段。

我們知道在沒有使用索引時,查詢一條資料需要遍歷整個資料表,速度很慢。在加過索引之後,速度會大大提公升。接著我們試著去研究一下為什麼把值排序成新的資料結構就可以加快我們的檢索速度呢?

我們先簡單地介紹下幾種資料結構。

1. hash:

2.二叉數:

二叉樹是n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹組成。

特點:(1)每個結點最多有兩顆子樹,所以二叉樹中不存在度大於2的結點。

(2)左子樹和右子樹是有順序的,次序不能任意顛倒。

(3)即使樹中某結點只有一棵子樹,也要區分它是左子樹還是右子樹。

3.平衡二叉樹

平衡二叉樹是基於二分法的策略提高資料的查詢速度的二叉樹的資料結構

特點:(1)非葉子節點只能允許最多兩個子節點存在。

(2)每乙個非葉子節點資料分布規則為左邊的子節點小當前節點的值,右邊的子節點大於當前節點的值(這裡值是基於自己的演算法規則而定的,比如hash值)

平衡二叉樹是採用二分法思維把資料按規則組裝成乙個樹形結構的資料,用這個樹形結構的資料減少無關資料的檢索,大大的提公升了資料檢索的速度

4.b樹

b樹和平衡二叉樹稍有不同的是b樹屬於多叉樹又名平衡多路查詢樹(查詢路徑不只兩個),所有葉子節點均在同一層、葉子節點除了包含了關鍵字和關鍵字記錄的指標外也有指向其子節點的指標。

特點:b樹相對於平衡二叉樹的不同是,每個節點包含的關鍵字增多了,特別是在b樹應用到資料庫中的時候,資料庫充分利用了磁碟塊的原理(磁碟資料儲存是採用塊的形式儲存的,每個塊的大小為4k,每次io進行資料讀取時,同乙個磁碟塊的資料可以一次性讀取出來)把節點大小限制和充分使用在磁碟快大小範圍;把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了,減少資料查詢的次數和複雜度;

5.b+樹

b+樹是b樹的乙個公升級版,相對於b樹來說b+樹更充分的利用了節點的空間,讓查詢速度更加穩定,其速度完全接近於二分法查詢。所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結

特點:(2)b+樹查詢速度更穩定:b+所有關鍵字資料位址都存在葉子節點上,所以每次查詢的次數都相同所以查詢速度要比b樹更穩定;

(3)b+樹天然具備排序功能:b+樹所有的葉子節點資料構成了乙個有序鍊錶,在查詢大小區間的資料時候更方便,資料緊密性很高,快取的命中率也會比b樹高。

(4)b+樹全節點遍歷更快:b+樹遍歷整棵樹只需要遍歷所有的葉子節點即可,,而不需要像b樹一樣需要對每一層進行遍歷,這有利於資料庫做全表掃瞄。

b樹相對於b+樹的優點是,如果經常訪問的資料離根節點很近,而b樹非葉子節點本身存有關鍵字其資料的位址,所以這種資料檢索的時候會要比b+樹快。

通過介紹幾種資料結構,可以將mysql索引分為hash索引和b+樹索引。

這裡為什麼不適用b樹索引呢?原因有:

1、b+樹的磁碟讀寫代價更低:b+樹的內部節點並沒有指向關鍵字具體資訊的指標,因此其內部節點相對b樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入記憶體的需要查詢的關鍵字也就越多,相對io讀寫次數就降低了。

2、b+樹的查詢效率更加穩定:由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。

3、b+樹更便於遍歷:由於b+樹的資料都儲存在葉子結點中,分支結點均為索引,方便掃庫,只需要掃一遍葉子結點即可,但是b樹因為其分支結點同樣儲存著資料,我們要找到具體的資料,需要進行一次中序遍歷按序來掃,所以b+樹更加適合在區間查詢的情況,所以通常b+樹用於資料庫索引。

4、b+樹更適合基於範圍的查詢:b樹在提高了io效能的同時並沒有解決元素遍歷的我效率低下的問題,正是為了解決這個問題,b+樹應用而生。b+樹只需要去遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而b樹不支援這樣的操作或者說效率太低。

下一節介紹索引的分類。

MySQL索引原理之索引原理

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

mysql索引 mysql索引實現原理

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

MySQL 索引與索引原理

本人菜鳥一枚,如有理解不對,請大神多多指正!一 索引 1 什麼是索引?答 索引類似於一本書的目錄,便於資料快速高效的查詢,也可以解釋為資料按照某個特定的規則去儲存排序資料 2 索引的型別?答 索引可以分為 普通索引,唯一索引,主鍵索引和組合索引 2.1 普通索引 最基本的一種索引方式,沒有什麼限制 ...