1. 程式人生 > 實用技巧 >索引與B+樹淺層總結1

索引與B+樹淺層總結1

為什麼要有索引?
一般應用系統,讀寫比列在10:1左右,插入操作和一般的更新操作很少出現問題,在生產環境中,我們遇到最多的,最容易出問題的是一些複雜的查詢問題,因此對查詢語句的優化就是重中之重了,只要查詢就提到了索引

什麼是索引?
索引在MySQL中也叫是⼀種“鍵”,是儲存引擎⽤於快速找到記錄的⼀種資料結構。索引對於良好的效能 非常關鍵,尤其是當表中的資料量越來越⼤時,索引對於效能的影響愈發重要。 索引優化應該是對查詢效能優化最有效的⼿段了。索引能夠輕易將查詢效能提⾼好⼏個數量級。 索引相當於字典的⾳序表,如果要查某個字,如果不使⽤⾳序表,則需要從⼏百⻚中逐⻚去查。

一:索引原理

索引的目的在於提高查詢效率

本質都是:通過不斷地縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。

二:磁碟IO與預讀、

    磁碟IO讀取資料
    ⼀次磁碟IO的時間約等於5+4.17 = 9ms左右,聽起來還挺不錯的,但

要知道⼀臺500 -MIPS(Million Instructions Per Second)的機器每秒可以執⾏5億條指令,因為指令依靠的是電的性質,換句話說執⾏⼀次IO的時間可以執⾏約450萬條指令,資料庫動輒⼗萬百萬乃⾄千萬級資料,每次9毫秒的時間,顯然是個災難
考慮到磁碟IO是非常⾼昂的操作,計算機作業系統做了⼀些優化,當⼀次IO時,不光把當前磁碟地址的資料,⽽是把相鄰的資料也都讀取到記憶體緩衝區內,因為區域性預讀性原理告訴我們,當計算機訪問⼀個地址的資料的時候,與其相鄰的資料也會很快被訪問到。每⼀次IO讀取的資料我們稱之為⼀⻚(page)。具體⼀⻚有多⼤資料跟作業系統有關,⼀般為4k或8k,也就是我們讀取⼀⻚內的資料時候,實際上才發⽣了⼀次IO,這個理論對於索引的資料結構設計非常有幫助。

三:索引的資料結構

樹
樹狀圖是一種資料結構,它是由n(n>=1)個有限結點組成一個具有層次關係的集合,把他叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉是朝下的。
它具有以下特點:
    1:每個結點有零個或多個結點;
    2:沒有父結點的點稱為根結點;
    3:每一個非根結點有且只有一個父結點;
    4:除了根結點外,每個子結點可以分為多個不相交的子樹。

B+樹
   任何⼀種資料結構都不是憑空產⽣的,⼀定會有它的背景和使⽤場景,我們需要這種資料結構能夠做些什麼,其實很簡單,那就是:每次查詢資料時把磁碟IO次數控制在⼀個很⼩的數量級,最好是常數數量級。
    那麼我們就想到如果⼀個⾼度可控的多路搜尋樹是否能滿⾜需求呢?就這樣,b+樹應運⽽⽣(B+樹是通過⼆叉查詢樹,再由平衡⼆叉樹,B樹演化⽽來)。

b+樹性質:
1:索引的最左匹配特性
2:..........

四.聚集索引與輔助索引
資料庫中的B+樹索引可以分為聚集索引(clustered index)和輔助索引(secondary index),
聚集索引與輔助索引相同的是:不管是聚集索引還是輔助索引,其內部都是B+樹的形式,即⾼度是平衡的,葉
⼦結點存放著所有的資料。
聚集索引與輔助索引不同的是:葉⼦結點存放的是否是⼀整⾏的資訊

1.聚集索引
#InnoDB儲存引擎表是索引組織表,即表中資料按照主鍵順序存放。⽽聚集索引(clustered index)就是按照每張表的主鍵構造⼀棵B+樹,同時葉⼦結點存放的即為整張表的⾏記錄資料,也將聚集索引的葉⼦結點稱為資料⻚。聚集索引的這個特性決定了索引組織表中資料也是索引的⼀部分。同B+樹資料結構⼀樣,每個資料⻚都通過⼀個雙向連結串列來進⾏連結。

如果未定義主鍵,MySQL取第⼀個唯⼀索引(unique)⽽且只含非空列(NOT NULL)作為主鍵,InnoDB使⽤它作為聚簇索引。

如果沒有這樣的列,InnoDB就⾃⼰產⽣⼀個這樣的ID值,它有六個位元組,⽽且是隱藏的,使其作為聚簇索引。

由於實際的資料⻚只能按照⼀棵B+樹進⾏排序,因此每張表只能擁有⼀個聚集索引。在多數情況下,查詢優化器傾向於採⽤聚集索引。因為聚集索引能夠在B+樹索引的葉⼦節點上直接找到資料。此外由於定義了資料的邏輯順序,聚集索引能夠特別快地訪問針對範圍值得查詢�

  聚集索引的好處之⼀:它對主鍵的排序查詢和範圍查詢速度非常快,葉⼦節點的資料就是⽤戶所要查詢的資料。
    聚集索引的好處之⼆:範圍查詢(range query),即如果要查詢主鍵某⼀範圍內的資料,通過葉⼦節點的上層中間節點就可以得到⻚的範圍,之後直接讀取資料⻚即可

2:輔助索引
表中除了聚集索引外其他索引都是輔助索引(Secondary Index,也稱為非聚集索引),與聚集索引的區別是:
輔助索引的葉⼦節點不包含⾏記錄的全部資料。
葉⼦節點除了包含鍵值以外,每個葉⼦節點中的索引⾏中還包含⼀個書(bookmark)。該書籤⽤來告訴InnoDB儲存引擎去哪⾥可以找到與索引相對應的⾏資料。

  由於InnoDB儲存引擎是索引組織表,因此InnoDB儲存引擎的輔助索引的書籤就是相應⾏資料的聚集索引鍵。

聚集索引與輔助索引的區別:
聚集索引
1.紀錄的索引順序與物理順序相同 因此更適合 between and 和order by操作
2. 葉子結點直接對應資料 從中間級的索引頁的索引行直接對應資料頁
3.每張表只能建立一個聚集索引
非聚集索引
1.索引順序與物理順序無關
2.葉子結點不直接指向資料頁
3.每張表可以有多個輔助索引,需要更多磁碟和內容 多個索引會影響insert 和update 的速度