日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

如何理解Mysql的索引及他们的原理--------二叉查找树和平衡二叉树和B树和B+树

發(fā)布時(shí)間:2023/12/10 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何理解Mysql的索引及他们的原理--------二叉查找树和平衡二叉树和B树和B+树 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.索引是什么東西?

索引就是一個(gè)數(shù)據(jù)結(jié)構(gòu),我們把表中的記錄用一個(gè)適合高效查找的數(shù)據(jù)結(jié)構(gòu)來(lái)表示,目的就是讓查詢變得更高效。

2.它到底怎么運(yùn)作的?

這個(gè)問題就說(shuō)來(lái)話長(zhǎng)了,且聽我慢慢道來(lái):

在mysql中使用最廣泛的數(shù)據(jù)引擎是InnoDB 引擎,它里面用的是 B+ 樹索引。

我們重點(diǎn)分析一下這個(gè)索引的原理:

要想理解B+樹索引要先從 二叉查找樹,平衡二叉樹和 B 樹說(shuō)起因?yàn)锽+樹索引就是由他們演化而來(lái):

什么是二叉查找樹?

?

滿足這樣條件的就叫二叉查找樹:

每個(gè)節(jié)點(diǎn)左邊節(jié)點(diǎn)的值都小于該節(jié)點(diǎn),右邊節(jié)點(diǎn)的值都大于該節(jié)點(diǎn),沒有值相等的節(jié)點(diǎn),最頂端的節(jié)點(diǎn)也就是“45”被稱為根節(jié)點(diǎn)。

二叉查找樹的查找過程:

若根結(jié)點(diǎn)的值等于查找的值,成功,

否則,若小于根結(jié)點(diǎn)的值,遞歸查左子樹(也就是根節(jié)點(diǎn)左邊的所有節(jié)點(diǎn)形成的樹)

若大于根結(jié)點(diǎn)的值,遞歸查右子樹(也就是根節(jié)點(diǎn)右邊所有節(jié)點(diǎn)形成的樹)。

假設(shè)用二叉查找樹創(chuàng)建book表的索引:

?

索引如下:

圖一

?

此處的bid為主鍵,每個(gè)節(jié)點(diǎn)存儲(chǔ)了主鍵的值和該條記錄的內(nèi)容。

如果我要查找bid為6的圖書的信息,則先用6和根節(jié)點(diǎn)的主鍵值7比較發(fā)現(xiàn)比7小,

然后6再和7左邊的節(jié)點(diǎn)5比較發(fā)現(xiàn)比5大找到5右邊的節(jié)點(diǎn)6,找到了,取出6對(duì)應(yīng)的記錄行的值ee.

總共經(jīng)歷了3次比較,如果掃描全表需要經(jīng)過5次比較。

?

什么是平衡二叉樹?

如果索引是這樣:

圖二

?

想要找到主鍵鍵值為9的記錄就需要6次比較,索引的優(yōu)勢(shì)完全體現(xiàn)不出來(lái)。

為什么會(huì)這樣?原因就在于這棵樹太高了,如果能想辦法把它變得矮一點(diǎn),胖一點(diǎn)就完美了。于是平衡二叉樹閃亮登場(chǎng):

平衡二叉樹首先也是一個(gè)二叉樹,需要滿足二叉樹的所有條件,然后有所改進(jìn),規(guī)定了左右子樹的高度差不能超過1,如果插入數(shù)據(jù)導(dǎo)致高度差超過了1則自動(dòng)進(jìn)行調(diào)整,回復(fù)到平衡狀態(tài)。這也是平衡二叉樹名字的由來(lái)。

圖一就是一顆平衡二叉樹,圖二根節(jié)點(diǎn)的左子樹高度為0,右子樹高度為5,高度差是5超過了1所以不是一顆平衡二叉樹。

平衡二叉樹查找效率要高于二叉樹。

?

什么是B樹?

由前面的推導(dǎo)我們可以看出要想查找,比較的次數(shù)最少,必須想辦法降低樹形結(jié)構(gòu)的高度,不管是二叉樹還是平衡二叉樹,每個(gè)節(jié)點(diǎn)最多只能有兩個(gè)子節(jié)點(diǎn),這就注定了它的高度受限于子節(jié)點(diǎn)的個(gè)數(shù),于是B樹橫空出世.

從上圖可以看到B樹的節(jié)點(diǎn)可以不止兩個(gè)子節(jié)點(diǎn),這樣的好處就是樹可以變得又矮又胖,矮胖的樹是索引的最愛,用它做索引可以降低磁盤的IO.

B樹中的每個(gè)節(jié)點(diǎn)根據(jù)實(shí)際情況可以包含大量的鍵值,數(shù)據(jù)和指針,上圖所示為一個(gè)3階的B樹:

每點(diǎn)占用一個(gè)磁盤塊的磁盤空個(gè)節(jié)間,一個(gè)節(jié)點(diǎn)上有兩個(gè)升序排序的鍵值和三個(gè)指向子樹根節(jié)點(diǎn)的指針,指針存儲(chǔ)的是子節(jié)點(diǎn)所在磁盤塊的地址。兩個(gè)鍵值劃分成的三個(gè)范圍域?qū)?yīng)三個(gè)指針指向的子樹的數(shù)據(jù)的范圍域。以根節(jié)點(diǎn)為例,鍵值為17和35,P1指針指向的子樹的數(shù)據(jù)范圍為小于17,P2指針指向的子樹的數(shù)據(jù)范圍為17~35,P3指針指向的子樹的數(shù)據(jù)范圍為大于35。

模擬查找關(guān)鍵字29的過程:

根據(jù)根節(jié)點(diǎn)找到磁盤塊1,讀入內(nèi)存。【磁盤I/O操作第1次】

比較關(guān)鍵字29在區(qū)間(17,35),找到磁盤塊1的指針P2。

根據(jù)P2指針找到磁盤塊3,讀入內(nèi)存。【磁盤I/O操作第2次】

比較關(guān)鍵字29在區(qū)間(26,30),找到磁盤塊3的指針P2。

根據(jù)P2指針找到磁盤塊8,讀入內(nèi)存。【磁盤I/O操作第3次】

在磁盤塊8中的關(guān)鍵字列表中找到關(guān)鍵字29。

分析上面過程,發(fā)現(xiàn)需要3次磁盤I/O操作,和3次內(nèi)存查找操作。由于內(nèi)存中的鍵值是一個(gè)有序表結(jié)構(gòu),可以利用二分法查找提高效率。而3次磁盤I/O操作是影響整個(gè)B樹查找效率的決定因素。

?

什么是B+樹?

想想還有沒有可能進(jìn)一步優(yōu)化,在B樹中每個(gè)節(jié)點(diǎn)的內(nèi)容由三部分組成:鍵值,指針,數(shù)據(jù),而磁盤塊的容量是有限的,并不是每次讀取磁盤塊都會(huì)取出里面的數(shù)據(jù),只是在最后一次讀取的時(shí)候才會(huì)取出里面的數(shù)據(jù),能不能將數(shù)據(jù)只存儲(chǔ)在葉子節(jié)點(diǎn)里面,非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值和指針呢?這樣就能最大化的利用磁盤塊空間,一個(gè)磁盤塊也就能存更多的東西了,沒錯(cuò),B+樹就是這么干的

假設(shè)在非葉子節(jié)點(diǎn)不存數(shù)據(jù)以后每個(gè)節(jié)點(diǎn)可以存儲(chǔ)4個(gè)鍵值和指針,就變成了上圖的B+樹

B+樹相對(duì)于B樹有幾點(diǎn)不同:

  • 非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值和指針。
  • 所有葉子節(jié)點(diǎn)之間都有一個(gè)鏈指針。
  • 數(shù)據(jù)記錄都存放在葉子節(jié)點(diǎn)中。
  • 在B+樹中因?yàn)槿~子節(jié)點(diǎn)的鍵值是按順序排列的所以進(jìn)行鍵值的范圍查找效率非常高。

    在B+樹中由于一個(gè)節(jié)點(diǎn)存儲(chǔ)了更多的鍵值和指針,所以同樣多的內(nèi)容可以降低樹的高度,減少磁盤io次數(shù),從而提高效率。

    數(shù)據(jù)庫(kù)的索引分為聚集索引和非聚集索引,innoDb存儲(chǔ)引擎中的聚集索引表中的數(shù)據(jù)按主鍵的順序存放,它實(shí)際上就是按主鍵構(gòu)建的一個(gè)B+樹,葉子節(jié)點(diǎn)存放的是數(shù)據(jù)行記錄。所以數(shù)據(jù)庫(kù)中的數(shù)據(jù)實(shí)際上是索引的一部分。由于實(shí)際的數(shù)據(jù)頁(yè)只能按照一個(gè)順序存放,所以每張表聚集索引只能有一個(gè)。

    非聚集索引的葉子節(jié)點(diǎn)中存放的是鍵值和主鍵值,所以通過非聚集索引需要先查找到主鍵值然后通過聚集索引查詢到具體的數(shù)據(jù),因此非聚集索引的效率要低于聚集索引。非聚集索引并不會(huì)影響到數(shù)據(jù)的存儲(chǔ)順序,所以非聚集索引可以存在多個(gè)。

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的如何理解Mysql的索引及他们的原理--------二叉查找树和平衡二叉树和B树和B+树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。