資料庫 3 2 優化你的索引 運用二叉查詢樹

2021-09-28 17:09:54 字數 1044 閱讀 9147

先看一下二叉樹的示意圖:

二叉查詢樹是每個節點最多有兩個子樹的資料結構,通常子樹被稱為左子樹或右子樹。二叉查詢樹的重要性質是,對於樹中的每個節點x,它的左子樹的任意節點的值均小於x,右子樹的任意節點的值都大於x。如果用二叉查詢樹來作為我們的索引,確實能夠提公升查詢效率。這裡需要我們注意的是,我們說的索引的儲存塊和我們之前說的資料庫的最小儲存單位——塊或頁,實際上並非一一對應,只是為了方便我們的理解,先將其一一對應起來。每個儲存塊,儲存的是關鍵字,還有指向子樹的指標。

像上圖左邊的樹,它不僅僅是二叉樹,還是平衡二叉樹,那什麼是平衡二叉樹呢?就是它的任意乙個節點的左子樹和右子樹,它的高度均不超過1。

二叉查詢樹查詢用的是二分查詢,比如說,我們要搜6,6比5要大,我們就找右子樹,找到7,7比6大,所以我們又會去查7的左子樹,這樣我們就能定位到6了。因為是對半搜尋,所以它的時間複雜度是o(logn),因此其查詢效率是非常高的。但是它也有缺點,首先咱們的資料庫的資料可能面臨著新增和刪除,比如刪除了2和6,新增了11和13,結果就變成右圖的線性二叉樹,那麼它的時間複雜度就變成了o(n),大大降低了查詢效率,有的人可能會說,我們可以利用樹的旋轉特性來保證這棵樹是平衡二叉樹,這樣其時間複雜度會維持在o(logn)就可以了。這樣確實解決了第乙個問題,但是它還會有第二個問題,咱們之前說了,影響程式執行速度的瓶頸在io,如果我們假定這些索引塊都在磁碟中,拿剛剛的檢索來講,去找6,會發生一次io,將這個根的資料讀入到我們的記憶體中,那之後呢,再發生一次io,將7讀入進來,緊接著再發生一次io,讀入了6,即檢索深度增加1,就會發生一次io,咱們的平衡二叉樹也好,紅黑樹也罷,每個節點最多只能有兩個孩子,而咱們的資料塊會非常多,因此為了組織起這些資料塊,咱們樹的深度就會很深很深,io的次數也會很多,這樣資料一多,其檢索效能比咱們之前說的全表掃瞄要慢很多,根本就沒法滿足我們的優化查詢的需求。那咱們還有什麼辦法,既降低查詢的時間複雜度,又降低io的次數呢?主要就是讓樹變得矮一些,資料呢每個節點能儲存的資料多一些,這個時候,咱們就想到b+tree了。請看下一章。

資料庫 3 3 優化你的索引 運用B樹

b樹的示意圖如下 b樹,又叫平衡多路查詢樹。如果每個節點最多有m個孩子,那麼這樣的樹就是m階樹,咱們可以看到,該圖就是3階b樹的樣子。當然現實中咱們索引每個節點的孩子數上限肯定是遠大於3的。每個儲存塊中,主要包含了關鍵字和指向孩子的指標,那麼最多能有幾個孩子,取決於每個儲存塊的容量以及資料庫的相關配...

二叉樹和資料庫索引

二叉樹 左節點 根節點,右節點 根節點,沒有鍵值相等的節點,二叉樹效率取決於樹的深度。普通二叉樹有可能退化為線性鍊錶。因此有了平衡二叉樹來提高效率保證資料平衡的情況下查詢資料的速度近於二分法查詢 平衡二叉樹 左右子樹高不超過1,所以在做增加刪除操作,需要進行旋轉來維護樹的平衡 耗資源 紅黑樹 是二叉...

資料庫優化之MySQL優化 二 索引優化

索引優化 分類 普通索引,唯一索引,主鍵索引,聯合索引 問題 如何選擇合適的列建立索引?1 在where從句,group by從句,order by從句,on從句中出現的列 2 索引字段越小越好 3 離散度大的列放到聯合索引的前面 select from payment where staff id...