拿排序進行說明,給乙個無序的陣列,將第乙個數放到a的位置,將下乙個數與第乙個數進行比較,如果比第乙個數小,就放在陣列的左邊,假如放在b的位置,然後再進乙個數,進來的數如果比a處的數小,到a的左子樹,然後與b處的數進行比較,如果比b處的數小,放在b的左子樹處,即c處。這種資料結構,具有鏈式資料結構的優點,搜尋查詢方便,但是新增或者刪除資料比較麻煩。
這是乙個二叉樹,但是他的排列結構是二叉樹,但是也可以理解成乙個鍊錶了。
平衡二叉樹,是一種特殊的二叉樹,他滿足二叉樹的基本的特點,如上面,二叉樹還有乙個特別的特點,平衡二叉樹的左右子樹之間的高度差不能超過1,如果超過1就把上乙個子樹作為節點,進行左旋
這棵樹始終滿足平衡二叉樹的幾個特性而保持平衡!這樣我們的樹也不會退化為線性鍊錶了!我們需要查詢乙個數的時候就能沿著樹根一直往下找,這樣的查詢效率和二分法查詢是一樣的呢!
上面的滿足下面的規則的平衡二叉樹就是b—樹
乙個m階的b-樹的特性:
1、每個結點最多m個子結點。
2、除了根結點和葉子結點外,每個結點最少有m/2(向上取整)個子結點。
3、如果根結點不是葉子結點,那根結點至少包含兩個子結點。
4、所有的葉子結點都位於同一層。
5、每個結點都包含k個元素(關鍵字),這裡m/2≤k6、每個元素(關鍵字)字左結點的值,都小於或等於該元素(關鍵字)。右結點的值都大於或等於該元素(關鍵字)。
下面以乙個 [0,1,2,3,4,5,6,7]的陣列插入一顆3階的b-tree為例:
遍歷的方式(查詢24):
平衡二叉樹和b-樹之間的對比
從這個流程我們能看出,b-tree的查詢效率好像也並不比平衡二叉樹高。但是查詢所經過的結點數量要 少很多,也就意味著要少很多次的磁碟io,這對效能的提公升是很大的。
前面對b-tree操作的圖我們能看出來,元素就是類似1、2、3這樣的數值,但是資料庫的資料都是一條條的資料,如果某個資料庫以b-tree的資料結構儲存資料,那資料怎麼存放的呢?我們看下一張圖
普通的b-tree的結點中,元素就是乙個個的數字。但是上圖中,我們把元素部分拆分成了key-data的形式,key就是資料的主鍵,data就是具體的資料。這樣我們在找一條數的時候,就沿著根結點往下找就ok了,效率是比較高的。
b+tree是在b-tree基礎上的一種優化,使其更適合實現外儲存索引結構。b+tree與b-tree的結構很像,但是也有幾個自己的特性:
1、所有的非葉子節點只儲存關鍵字資訊。
2、所有衛星資料(具體資料)都存在葉子結點中。
3、所有的葉子結點中包含了全部元素的資訊。
4、所有葉子節點之間都有乙個鏈指標。
如果上面b-tree的圖變成b+tree ,那應該如下:
1、非葉子結點上已經只有key資訊了,滿足上面第1點特性!
2、所有葉子結點下面都有乙個data區域,滿足上面第2點特性!
3、非葉子結點的資料在葉子結點上都能找到,如根結點的元素4、8在最底層的葉子結點上也能找到, 滿足上面第3點特性!
4、注意圖中葉子結點之間的箭頭,滿足滿足上面第4點特性!
在講這兩種資料結構在資料庫中的選擇之前,我們還需要了解的乙個知識點是作業系統從磁碟讀取資料到記憶體是以磁碟塊(block)為基本單位的,位於同乙個磁碟塊中的資料會被一次性讀取出來,而不是 需要什麼取什麼。
即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。這樣做的理 論依據是電腦科學中著名的區域性性原理:當乙個資料被用到時,其附近的資料也通常會馬上被使用。預讀的長度一般為頁(page)的整倍數。
頁是計算機管理儲存器的邏輯塊,硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(在許多作業系統中,頁得大小通常為4k)。
討論:
1、b-tree因為非葉子結點也儲存具體資料,所以在查詢某個關鍵字的時候找到即可返回。而b+tree所有的資料都在葉子結點,每次查詢都得到葉子結點。所以在同樣高度的b-tree和b+tree中,b-tree查詢某個關鍵字的效率更高 。
2、由於b+tree所有的資料都在葉子結點,並且結點之間有指標連線,在找大於某個關鍵字或者小於某個關鍵字的資料的時候,b+tree只需要找到該關鍵字然後沿著鍊錶遍歷就可以了,而b-tree還需要遍歷該關鍵字結點的根結點去搜尋。
3、由於b-tree的每個結點(這裡的結點可以理解為乙個資料頁)都儲存主鍵+實際資料,而b+tree非葉子結點只儲存關鍵字資訊,而每個頁的大小有限是有限的,所以同一頁能儲存的b-tree的資料會比 b+tree儲存的更少。這樣同樣總量的資料,b-tree的深度會更大,增大查詢時的磁碟i/o次數,進而影響查詢效率。
鑑於以上的比較,所以在常用的關係型資料庫中,都是選擇b+tree的資料結構來儲存資料!
資料庫 SQL索引基礎
sql索引目錄 要想做好索引優化,知道索引的儲存結構是至關重要的。談到儲存就需要了解sql中的頁和區的概念 乙個區包含8個頁,它是管理空間的單位,分為如下兩類 一般情況下,給表或者索引申請新的空間時,從混合區分配,當這個表或者索引的空間超過8個頁大小時,會將原本在混合區的頁轉移到統一區管理。知識了區...
資料庫 SQL索引基礎
sql索引目錄 要想做好索引優化,知道索引的儲存結構是至關重要的。談到儲存就需要了解sql中的頁和區的概念 乙個區包含8個頁,它是管理空間的單位,分為如下兩類 一般情況下,給表或者索引申請新的空間時,從混合區分配,當這個表或者索引的空間超過8個頁大小時,會將原本在混合區的頁轉移到統一區管理。知識了區...
資料庫 索引的底層原理
索引的底層原理 mysql支援兩種索引,b 樹索引,雜湊表索引 儲存引擎為myisam和innodb的索引結構 myisam儲存引擎 主鍵索引 非聚集索引 myisam引擎使用b 樹作為索引結構 葉節點的data域存放的是資料記錄位址 myisam中,主索引和輔助索引在結構上沒有任何區別,只是主索引...