十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
索引常見數(shù)據(jù)結(jié)構(gòu):
澤州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!順序查找: 最基本的查詢算法-復(fù)雜度O(n),大數(shù)據(jù)量此算法效率糟糕。
二叉樹查找(binary tree search): O(log2n),數(shù)據(jù)本身的組織結(jié)構(gòu)不可能完全滿足各種數(shù)據(jù)結(jié)構(gòu)。
hash索引 無法滿足范圍查找。哈希索引基于哈希表實現(xiàn),只有精確匹配索引所有列的查詢才有效。
二叉樹、紅黑樹 [復(fù)雜度O(h)]導(dǎo)致樹高度非常高(平衡二叉樹一個節(jié)點只能有左子樹和右子樹),邏輯上很近的節(jié)點(父子)物理上可能很遠,無法利用局部性,IO次數(shù)多查找慢,效率低。todo 邏輯上相鄰節(jié)點沒法直接通過順序指針關(guān)聯(lián),可能需要迭代回到上層節(jié)點重復(fù)向下遍歷找到對應(yīng)節(jié)點,效率低
B-Tree
B+Tree: B-Tree的變種
為什么Mysql選擇B+TREE索引? B+TREE索引有什么好處?
索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產(chǎn)生磁盤I/O消耗,相對于內(nèi)存存取,I/O存取的消耗要高幾個數(shù)量級,所以索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤I/O的存取次數(shù),提升索引效率。
局部性原理與磁盤預(yù)讀:
由于存儲介質(zhì)的特性,磁盤本身存取就比主存慢很多,再加上機械運動耗費,磁盤的存取速度往往是主存的幾百分分之一,因此為了提高效率,要盡量減少磁盤I/O。為了達到這個目的,磁盤往往不是嚴(yán)格按需讀取,而是每次都會預(yù)讀,即使只需要一個字節(jié),磁盤也會從這個位置開始,順序向后讀取一定長度的數(shù)據(jù)放入內(nèi)存。預(yù)讀可以提高I/O效率。預(yù)讀的長度一般為頁(page:計算機管理存儲器的邏輯塊-通常為4k)的整倍數(shù). 主存和磁盤以頁為單位交換數(shù)據(jù)。當(dāng)程序要讀取的數(shù)據(jù)不在主存中時,會觸發(fā)一個缺頁異常,此時系統(tǒng)會向磁盤發(fā)出讀盤信號,磁盤會找到數(shù)據(jù)的起始位置并向后連續(xù)讀取一頁或幾頁載入內(nèi)存中。
B-/+Tree索引的性能優(yōu)勢:
一般使用磁盤I/O次數(shù)評價索引優(yōu)劣。1.結(jié)合操作系統(tǒng)存儲結(jié)構(gòu)優(yōu)化處理: mysql巧妙運用操作系統(tǒng)存儲結(jié)構(gòu)(一個節(jié)點分配到一個存儲頁中->盡量減少IO次數(shù)) & 磁盤預(yù)讀(緩存預(yù)讀->加速預(yù)讀馬上要用到的數(shù)據(jù)).2.B+Tree 單個節(jié)點能放多個子節(jié)點,相同IO次數(shù),檢索出更多信息。3.B+TREE 只在葉子節(jié)點存儲數(shù)據(jù) & 所有葉子結(jié)點包含一個鏈指針 & 其他內(nèi)層非葉子節(jié)點只存儲索引數(shù)據(jù)。只利用索引快速定位數(shù)據(jù)索引范圍,先定位索引再通過索引高效快速定位數(shù)據(jù)。
來源
B+樹的優(yōu)勢:
因為B+樹沒有與內(nèi)部節(jié)點相關(guān)聯(lián)的數(shù)據(jù),所以在內(nèi)存頁面上可以容納更多的鍵。因此,訪問葉子節(jié)點上的數(shù)據(jù)需要更少的緩存丟失。
B+樹的葉節(jié)點是鏈接的,因此對樹中的所有對象進行全面掃描只需要一個線性遍歷所有葉節(jié)點。另一方面,B樹需要遍歷樹中的每一層。這種全樹遍歷可能比B+葉子的線性遍歷涉及更多的緩存丟失。
B樹的優(yōu)勢:
因為B樹包含每個鍵的數(shù)據(jù),所以經(jīng)常訪問的節(jié)點可以更靠近根,因此可以更快地訪問。