亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mysql索引原理

發布時間:2020-07-25 19:39:52 來源:網絡 閱讀:271 作者:石小令 欄目:MySQL數據庫

說起Mysql就離不開SQL優化,說起優化就離不開索引,那么什么是索引?為什么加了索引就可以快?那接下來我們就一起來探討一下索引相關的知識!

一、數據結構中常見的索引

【對這塊數據結構了解的同學建議跳過本節】

1.二叉樹

說起二叉樹,我們都知道每個結點最多只能有兩個子結點,例如:
Mysql索引原理
可以發現二叉樹很有規律,左子結點小于當前結點,右子結點大于當前結點。那這樣不是查詢起來很方便呢?二叉樹的性質決定了它的時間復雜度為 Olog(n),當然,二叉樹的時間復雜度與它的插入順序有著,如果按升序或降序的方式插入數據,那么它的二叉樹的高度h就與結點個數相等了,此時復雜度就提高到了O(n)。

假如,數據庫使用二叉樹來做索引,此時需要插入1000條數據,我們來計算一下這樹的高度。(深度為k的二叉樹最少有k個結點,最多有2^k-1個結點)

2^10-1 ≈ 1000    此時樹的高度約為10
最差的情況,樹的高度為1000

樹的高度決定了查詢的效率,而二叉樹又會存在高度10~1000這么大的差距,很明顯它已經不適合做我們的索引了!

2.平衡樹

前面把問題擺出來了,二叉樹的高度很不穩定,那我們能不能把高度穩定一下呢?這就是平衡樹,它會根據插入的情況,動態的調整二叉樹的高度(左右子樹的高度最多差1),比如:我們插入從10,9,8,,,1
Mysql索引原理
看,我沒有騙你吧,它會根據插入的情況調整樹的高度,具體怎么調整的,我只簡單說明一下吧,畢竟不是本文的重點。

平衡樹的調整分四種情況:

LL、LR、RL、RR

Mysql索引原理
這種情況很好理解

Mysql索引原理
這種情況就是,先將5與6結點左旋轉,然后轉成了LL型,再右旋轉。
好了,另外兩種就不說了,和這兩種的旋轉方式正好相反而已。

咳咳,回到正題,現在好了,平衡樹足以保證了樹的平衡,那么使用它來做索引有沒有 問題呢?
假如我們有100000 條記錄,那么根據二叉樹的性質,樹的高度最低約為2^16,也就是查找一個元素需要查找16次,有同學可能說,嗯,查詢16次我可以接受了,那么假如插入或刪除數據呢?AVL樹的最大缺點就是插入結點時,樹需要頻繁的旋轉調整結點,所以平衡樹也不太適合做索引。

3.紅黑樹

前面說了平衡樹對二叉樹的要求,左右子樹的高度最多差1,插入數據稍有不慎就會造成平衡樹的轉換操作,而轉換又是非常耗時的一件事情。
而紅黑樹的出現就是為了避免平衡樹的頻繁轉換結點操作。紅黑樹 并不追求 完全平衡 它只要求部分結點達到平衡,降低了對旋轉的要求,從而提高了性能。先看下紅黑樹的定義吧!

*   每個結點要么是紅的要么是黑的。  
*   根結點是黑的。  
*   每個葉結點(葉結點即指樹尾端NIL指針或NULL結點)都是黑的。  
*   如果一個結點是紅的,那么它的兩個兒子都是黑的。  
*    對于任意結點而言,其到葉結點樹尾端NIL指針的每條路徑都包含相同數目的黑結點。 

Mysql索引原理

插入或刪除元素時,也是需要維護紅黑樹結構的,之所以索引也不使用紅黑樹主要是二叉樹保存大量結點的時候,會導致樹的高度不斷增加。比如1億個節點,樹的高度就會達到27層左右,而一般索引又是保存到磁盤中的,如果每次查詢都需要一次IO的話,那也就是需要27次IO操作,而每次IO操作都是非常耗時的。

4.B樹

平衡樹、紅黑樹都是二叉樹,當二叉樹保存大量元素的時候會導致樹的高度不斷增高,那可不可以使用多叉樹呢?
Mysql索引原理
先來看下B樹的定義:

1、B樹的組成
    關鍵字(可以理解為數據)
    指向孩子節點的指針

Mysql索引原理

2、B樹的性質:
* 若根結點不是終端結點,則至少有2棵子樹
* 除根節點以外的所有非葉結點至少有 M/2 棵子樹,至多有 M 個子樹(關鍵字數為子樹減一)
* 所有的葉子結點都位于同一層

5.B+樹

B+樹與B樹的區別主要在于:

* 節點的子樹數和關鍵字數相同(B 樹是關鍵字數比子樹數少一)
* 節點的關鍵字表示的是子樹中的最大數,在子樹中同樣含有這個數據
* 葉子節點包含了全部數據,同時符合左小右大的順序

Mysql索引原理

B+樹相比B樹的優點再于:層級更低,葉子結點形成鏈表,范圍查詢方便;

二、Mysql中的B樹與B+樹

1.磁盤讀取原理

索引文件一般以文件的形式存在磁盤上面,索引檢索操作需要磁盤的IO,但是磁盤順序讀取的效率很高,所以在讀取的時候,磁盤往往不是按需讀取,而且每次都會預讀,即使只需要一個字節,磁盤也會從這個位置開始,順序向后讀取一定長度的數據放入內存。由于磁盤順序讀取的效率很高,因此對于具有局部性的程序來說,預讀可以提高IO效率。預讀的長度一般為頁的整數倍(頁是計算機管理存儲器的邏輯塊,操作系統往往將主存和磁盤存儲區分割為連續的大小相等的塊,每個存儲塊稱為一頁,大小通常是4K)主存和磁盤以頁為單位交換數據。當程序要讀取的數據不在主存中時,會觸發一個缺頁異常,此時系統會向磁盤發出讀盤信號,磁盤會找到數據的起始位置并向后連續讀取一頁或幾頁載入內存中,然后異常返回,程序繼續運行

2.Innodb中的B+樹

Innodb中使用是B+樹作為索引,比如下圖中的主索引:
Mysql索引原理

葉子結點包含了所以的結點,除了葉子結點之外,其它結點不包含值,而葉子結點包含具體的值

二級索引
Innodb中的二級索引,也是一棵B+樹,只是它的葉子結點指向的是主索引中的主鍵值,然后再去主索引中查找具體的值;
Mysql索引原理

3.myISAM中的B+樹

MyISAM引擎使用B+樹作索引時,結構與Innodb大致相同,只是它葉子結點存放的不是具體的記錄值,而是記錄的地址。
Mysql索引原理

二級索引
一級索引中,MyISAM的索引文件僅僅保存數據記錄的地址,而二級索引在結構上沒有任何區別,二級索引也是直接指向記錄的地址。
Mysql索引原理

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳池县| 江都市| 新余市| 揭阳市| 鸡东县| 台州市| 阿荣旗| 阿拉善盟| 深水埗区| 高要市| 双桥区| 临海市| 斗六市| 濮阳县| 乌审旗| 桃源县| 南昌市| 汕尾市| 巴马| 河曲县| 潜江市| 广汉市| 曲麻莱县| 汉沽区| 兴城市| 扶余县| 息烽县| 屯昌县| 思南县| 临澧县| 湖口县| 英超| 盈江县| 织金县| 登封市| 嘉兴市| 桃园市| 杂多县| 鄢陵县| 河东区| 莱州市|