不得不看的B樹索引

2021-10-01 10:43:07 字數 3507 閱讀 6865

一、先導:練習:[31 18 73 9 27 37 99]

上面資料經過一系列插入後:變成了有序的結構,且符合二叉樹的特性

但是如果是同一組數[9 18 27 31 37 73 99],公升序後再排序:

這種情況出現了嚴重的傾斜,這是比較極端的情況 ,二叉樹變成線性結構了,查詢效率明顯降低,沒有發揮出二叉樹的優勢。

為了不讓二叉樹出現嚴重傾斜,提出了平衡二叉樹的概念。

2、平衡二叉樹: 特殊的二叉樹

比二叉樹多了乙個特性:

左右2個子樹的高度差的絕對值不會超過1,並且左右2個子樹都是平衡二叉樹。

乙個平衡二叉樹最多能容納:20+ 21+22+…+2h-1,h為高度。

這樣計算100w的資料,高度為20,從有著100w條資料的平衡二叉樹中找乙個資料最多20次,如果是記憶體,效率很高,但是資料庫中的資料基本上是放到磁碟的,每讀取乙個二叉樹結點就是一次磁碟io,找一條資料,經過20次磁碟io,效能就很差了。於是考慮把平衡二叉樹壓縮(由高變成胖),即b-樹。

3 、b-樹 :

特性:

我們都知道資料庫的資料是一條條存在的。

思考:資料庫以b-樹資料結構存數資料,資料是如何存放的呢?

把元素部分拆成了key-data形式,key就是主鍵,data就是資料。

4、b+樹:

b+樹是在b-樹基礎上的乙個優化。

特點:

思考2:b-tree 與二叉查詢樹?

二叉查詢樹查詢的時間複雜度o(logn),查詢速度最快和比較次數最少,既然效能已經如此優秀,為什麼實現索引使用b-tree 而不是二叉查詢樹,主要是因為 磁碟io的次數。

資料庫索引是儲存在磁碟上的,當表中的資料量比較大時,索引的大小也跟著增長,達到幾個g。當我們利用索引進行查詢時,不可能把索引全部載入到記憶體中,只能逐一載入每個磁碟頁,這裡的磁碟頁就對應索引樹的結點。

5、補充知識:

硬碟如何儲存資料:

分類:機械硬碟和固態硬碟

機械硬碟: 裡面裝有兩面都塗有磁性材料的磁碟,在工作時,會不停的旋轉,寫入資料時,會利用磁頭改變磁碟上磁性材料的極性(正負分別對應0和1),而讀取資料時,旁邊的讀取器可以識別磁性材料的不同極性,還原成0或1。

一片磁碟分為若干個磁軌,乙個磁軌分為各個扇區,扇區是磁碟儲存資料的最小資料塊,一般是512位元組。要想讀取某個檔案,必須在電機驅動下,先找到對應的磁軌,再等磁碟轉到對應扇區才行,一般會有十幾秒的延遲,這就導致在讀取分散在磁碟各處的資料時,速度大幅度降低。

機械磁碟如下圖:

磁軌示意圖:

固態硬碟: 基於電路的固態硬碟 ,不會有機械硬碟的延遲,儲存資料靠的是快閃儲存器。在寫入資料時,資料會通過就介面進入主控制器,經處理後,再分配到快閃儲存器中儲存。快閃儲存器的基本儲存單位是浮柵電晶體

固態硬碟:

浮柵電晶體:

二、索引的結構:

b+樹索引:

b+樹索引知識點補充:

1.非主鍵索引:非主鍵索引的葉子節點存的是主鍵索引值,避免維護事務,如果非主鍵索引的葉子節點也儲存data,那麼就會有多份資料,需要保證多份資料的一致性,以及多份資料都會佔磁碟空間。

2.乙個索引就是一顆b+樹

3.聯合索引:例如index(a,b,c),會先按a排序,a相同的情況下,再按b排序,a,b都相同,就按排序。索引盡量遵循最左字首原則,如果是mysql的話,使用b,c作為查詢條件,就不會走索引,oracle11g貌似會走索引,底層做了優化,有待確認

4.儘量減少多個單值索引的使用,多使用聯合索引

5.聚集索引和非聚集索引:

聚集索引:索引和資料(data)放在乙個檔案裡

非聚集索引:索引和資料(data)放在不同的檔案裡,可能涉及回表操作

6.回表:通過非主鍵索引拿到主鍵索引值,再去主鍵索引樹拿資料(data)。盡量避免回表操作,比如使用覆蓋索引(即查詢的字段在非主鍵索引樹中可以拿到)

7.oracle 鎖表後,可以新增資料,但是不能刪除和修改原來的資料,mysql鎖表後是不允許新增資料的

8.mysql排序分為filesort(檔案排序)和索引排序(index sort):

a.file sort:分為單路排序和雙路排序(回表排序),之所有有這2種,是因為sort_buffer大小有限

單路排序:會根據索引找到所有查詢欄位和排序欄位都放在sort_buffer(預設是1024)中,然後再排序

雙路排序:根據索引找到查詢資料的行資料的行id和排序字段放在sort_buffer中,然後再根據行id去主鍵索引樹取出所有需要的字段

b.index sort:效率高

二、索引的使用:

建立索引原則:

索引使用條件:

三、索引的分類:

b樹,函式,位圖,反序,反向,分割槽

四、索引的運維:

索引的作用:保證業務的完整性

索引的優點:提高查詢速度

索引的缺點:增加儲存空間,降低dml語句的效率

索引雖然能加快檢索速度,但是在有些情況下,使用索引查詢一樣會很慢,這時候需要分析資料,考慮重建索引

五、各種索引的優缺點:

hash索引:效率高,但是對範圍查詢,模糊查詢不能很好的支援

b+樹索引:能很好的支援範圍查詢和%在後面的模糊查詢(把其當做乙個變數)

六、分析sql的效能工具:

執行計畫:explan

trace工具:

七、常見sql優化:

mysql的表關聯常見的2種演算法:

IT人士不得不看的成長手冊

作為it技術人員,相信沒有乙個人願意永遠在底層編寫程式或做簡單的系統維護。經過一段時間的技術和經驗的積累,很多人都嚮往更高層的職位,但如何能成為乙個專業的it管理人才,並不是每乙個人都清晰 明了。如果你真想成為一名成功 成熟的it專家,你需要不斷地擴充套件你的技能與知識 有些知識領域可能對你很陌生,...

this指向 不得不看的this指向問題

分析this的指向共有四種型別 1 函式被呼叫時 即執行時 才會確定該函式內this的指向。因為在函式中this與arguments是兩個特殊的變數,在函式被呼叫時才會取得它們,而且搜尋這兩個變數時只會在活動物件範圍裡面去搜。2 要確定函式中this的指向,必須先找到該函式被呼叫的位置。認準第一種 ...

IT人士不得不看的保健手冊

專門針對站長生活習性的作息飲食建議 看不起的病 不死的癌症 1 堅持 定時 休息 12點之前 標準睡眠時間8小時 2 養成習慣起床後 喝水 茶 休息後再 吃早餐 雞蛋 稀飯 粥 玉公尺糊 包子 青菜等,建議避免 油炸的 3 飯後百步走 飯後散步 10分鐘左右 4 每小時休息讓眼睛休息幾分鐘 看遠方 ...