先介紹幾種資料結構:
紅黑樹:平衡二叉樹,能保證在最壞情況下,基本的動態幾何操作的時間均為o(lgn)有如下幾個特性:
1)每個結點要麼是紅的,要麼是黑的。
2)根結點是黑的。
3)每個葉結點(葉結點即指樹尾端nil指標或null結點)是黑的。
4)如果乙個結點是紅的,那麼它的倆個兒子都是黑的。
5)對於任一結點而言,其到葉結點樹尾端nil指標的每一條路徑都包含相同數目的黑結點。
相比於bst,因為紅黑樹可以能確保樹的最長路徑不大於兩倍的最短路徑的長度,所以可以看出它的查詢效果是有最低保證的。在最壞的情況下也可以保證o(logn)的,這是要好於二叉查詢樹的。因為二叉查詢樹最壞情況可以讓查詢達到o(n)。
b樹:即二叉搜尋樹,都是小的元素放左邊,大的元素放右邊。比如說要查詢某個元素,其時間複雜度就對應該元素的深度,如要查詢9,從根節點開始,只要比較三次就找到他了,其查詢效率是非常高的。
b-樹:這裡的 b 表示 balance( 平衡的意思),b-樹是一種多路自平衡的搜尋樹
它類似普通的平衡二叉樹,不同的一點是b-樹允許每個節點有更多的子節點。下圖是 b-樹的簡化圖.
b-樹有如下特點:
所有鍵值分布在整顆樹中;
任何乙個關鍵字出現且只出現在乙個結點中;
搜尋有可能在非葉子結點結束;
在關鍵字全集內做一次查詢,效能逼近二分查詢;
b+樹:b+樹是b-樹的變體,也是一種多路搜尋樹, 它與b- 樹的不同之處在於:
所有的資料都存放在葉子節點上,且
把葉子節點通過指標連線到一起,形成了一條資料鏈表,以加快相鄰資料的檢索效率。
簡化 b+樹 如下圖
tire樹(字典樹):用在統計和排序大量字串,如自動機。
1. b+/b-樹索引:檔案系統及資料庫系統普遍採用b-/+tree作為索引結構。mysql 是基於磁碟的資料庫系統,索引往往以索引檔案的形式儲存的磁碟上,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。為什麼使用b-/+tree,還跟磁碟訪問原理有關。
區域性性原理與磁碟預讀
由於磁碟的訪問速度與記憶體之間鴻溝,為了提高效率,要儘量減少磁碟i/o.磁碟往往不是嚴格按需讀取,而是每次都會預讀,磁碟讀取完需要的資料,會順序向後讀一定長度的資料放入記憶體。而這樣做的理論依據是電腦科學中著名的區域性性原理:當乙個資料被用到時,其附近的資料也通常會馬上被使用。序執行期間所需要的資料通常比較集中。
由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率.預讀的長度一般為頁(page)的整倍數。
mysql(預設使用innodb引擎),將記錄按照頁的方式進行管理,每頁大小預設為16k(這個值可以修改).linux預設頁大小為4k。
為什麼使用 b+樹?
1. b+樹更適合外部儲存,由於內節點無 data 域,乙個結點可以儲存更多的內結點,每個節點能索引的範圍更大更精確,也意味著 b+樹單次磁碟io的資訊量大於b-樹,i/o效率更高。
2. mysql是一種關係型資料庫,區間訪問是常見的一種情況,b+樹葉節點增加的鏈指標,加強了區間訪問性,可使用在範圍區間查詢等,而b-樹每個節點 key 和 data 在一起,則無法區間查詢。
我們得出結論,由於資料存數在磁碟上,因此應該儘量減少磁碟i/o次數。恰好,b+樹的葉子節點儲存了關鍵字的資料層(我們可以稱為主鍵),因此我們可以直接通過主鍵來查詢資料。若是使用二叉樹,二叉樹索引的只是主鍵的位置,我還需要根據二叉樹索引主鍵的位置,進行一次i/o操作來獲取主鍵。
2.雜湊索引:使用雜湊索引的原因是,在尋找值時雜湊表效率極高。但是因為hash結構,每個鍵只對應乙個值,而且是雜湊的方式分布。所以它並不支援範圍查詢和排序等功能。
mysql not 索引 MySQL 索引結構
為資料表增加索引 index 可以提公升mysql資料查詢效率。mysql中所有型別的資料字段都可以有索引。索引指向了資料表中的記錄 行 可以快速判斷某行記錄是否符合 where 語句中的限定條件。但是索引並不是越多越好 索引需要耗費儲存空間 索引越多,mysql在決定採用哪個索引時也會消耗更多時間...
組合索引的索引結構
在網路上有很多mysql的索引的結構的介紹,相信你對索引的結構已經非常了解了,關於組合索引呢?組合索引是在b 樹中的結構是怎麼樣的?怎麼排序的?索引中相同的值,儲存的id是什麼結構?在本篇文章中就跟你一一說明 一 組合索引的圖示 話不多說,直接上圖 上面是根據身高年齡建立的組合索引 height,a...
mysql多索引結構 MySQL 索引結構詳解
innodb的主鍵索引 primary key 是cluster形式的 聚簇索引 innodb的非主鍵索引 secondary index 是普通的b tree索引。兩種索引在root node和branch node是一樣的,在leaf node就不一樣了。primary key存放的是表的實際資...