1. 程式人生 > >原理:資料結構-索引 && 應用篇:MySQL索引背後的資料結構及演算法原理詳解

原理:資料結構-索引 && 應用篇:MySQL索引背後的資料結構及演算法原理詳解

特點簡介:

索引檔案比資料檔案小,可以有效地裝載到記憶體。通過對記憶體索引檔案的查詢定位到記錄,然後通過一次磁碟物件讀取操作就可以獲取到需要搜尋的物件。

靜態索引結構和動態索引結構啥區別?

我認為靜態是指新節點的加入對原有的索引結構不會發生改變,比如:稠密索引直接把新節點加到陣列的後面;倒排表新次關鍵碼的加入直接加到次關鍵碼列表的後面,已有次關鍵碼新增新物件,只要在次關鍵碼物件連結串列中加入新物件地址指標即可。而作為典型動態索引結構的B,新索引節點的加入為了保持搜尋樹的平衡性,可能需要調整樹的結構以滿足平衡性。

1、靜態索引結構

1)、線性索引 (主鍵索引)(索引陣列儲存)

稠密索引:

一個索引項對應資料表中的一個物件。當物件在外存中按新增的順序而不是按關鍵碼有序存放的時候必須採用稠密索引。

稀疏索引(索引順序結構):

資料物件在外存中按關鍵碼(主鍵)分塊有序存放,每個子塊中的物件可以是有序,也可以是無序,有序的話子塊中可以使用折半查詢,提高查詢速度,但是新增記錄也會慢些。

對索引順序結構進行查詢時,根據關鍵碼先在索引中定位物件所在的資料子塊,然後在子塊中定位查詢的物件。

2)、倒排表

主鍵索引能唯一地標識物件,也叫主索引。主鍵只有一個,日常應用中也需要對其它熟悉列進行搜尋,所有,除了主關鍵碼外,也有必要把其它常用的搜尋屬性設定為次關鍵碼,建立次索引表。次索引列因為屬性值不是唯一的,所以在次索引中,建立一個所有值的一個列表,對每個取值建立一個具有相同屬性值的物件的存放有序或主鍵有序的順序連結串列。次索引中存放物件地址的指標可以用主鍵來表示,這樣在非主鍵屬性列查詢中,可以先在次索引中查詢到物件主鍵,然後在主鍵索引中找到物件的地址。

3)、m路靜態搜尋樹(多級索引)

m路搜尋樹:

當資料量很龐大的時候,索引塊也會非常大,一次性無法讀入所有的索引塊到記憶體,這個時候就要考慮多級索引,最高一級的索引常駐記憶體就可以了,每一級中的字索引塊有自己最大主關鍵碼值。多級索引中,每個索引塊大小一樣,每個索引塊最大存放m個索引項,每個索引項給出各子樹節點最大關鍵碼和存放地址,這樣形成了m叉樹,這種利用m叉樹實現的多級索引,就是m路搜尋樹。m叉樹中m意思是每個索引塊中最大存放的索引項數目,跟索引級數沒有關係。m叉樹中葉節點中個索引項給出資料表中物件的關鍵碼和存放地址。

2、動態索引結構(動態m路搜尋樹)

動態調整的目的一般就是保持搜尋樹的平衡性。

1)、B樹

定義可以參考書籍,說說和B+樹的理解和定義中不明確的地方,B樹中每個節點包含了鍵值和鍵值對於的資料物件存放地址指標,所以成功搜尋一個物件可以不用到達樹的葉節點。成功搜尋包括節點內搜尋和沿某一路徑的搜尋,成功搜尋時間取決於關鍵碼所在的層次以及節點內關鍵碼的數量。在B樹中查詢給定關鍵字的方法是:首先把根結點取來,在根結點所包含的關鍵字K1,…,kj查詢給定的關鍵字(可用順序查詢或二分查詢法),若找到等於給定值的關鍵字,則查詢成功;否則,一定可以確定要查的關鍵字在某個Ki或Ki+1之間,於是取Pi所指的下一層索引節點塊繼續查詢,直到找到,或指標Pi為空時查詢失敗。

2)、B+樹

B樹的變種。B+樹非葉節點中存放的關鍵碼並不指示資料物件的地址指標,非也節點只是索引部分。所有的葉節點在同一層上,包含了全部關鍵碼和相應資料物件的存放地址指標,且葉節點按關鍵碼從小到大順序連結。如果實際資料物件按加入的順序儲存而不是按關鍵碼次數儲存的話,葉節點的索引必須是稠密索引,若實際資料儲存按關鍵碼次序存放的話,葉節點索引時稀疏索引。B+樹有2個頭指標,一個是樹的根節點,一個是最小關鍵碼的葉節點。

所以 B+樹有兩種搜尋方法:

一種是按葉節點自己拉起的連結串列順序搜尋。

一種是從根節點開始搜尋,和B樹類似,不過如果非葉節點的關鍵碼等於給定值,搜尋並不停止,而是繼續沿右指標,一直查到葉節點上的關鍵碼。所以無論搜尋是否成功,都將走完樹的所有層。B+ 樹中,資料物件的插入和刪除僅在葉節點上進行。

這兩種處理索引的資料結構的不同之處:

Ø  B樹中同一鍵值不會出現多次,並且它有可能出現在葉結點,也有可能出現在非葉結點中。而B+樹的鍵一定會出現在葉結點中,並且有可能在非葉結點中也有可能重複出現,以維持B+樹的平衡。

Ø  因為B樹鍵位置不定,且在整個樹結構中只出現一次,雖然可以節省儲存空間,但使得在插入、刪除操作複雜度明顯增加。B+樹相比來說是一種較好的折中。

Ø  B樹的查詢效率與鍵在樹中的位置有關,最大時間複雜度與B+樹相同(在葉結點的時候),最小時間複雜度為1(在根結點的時候)。而B+樹的時候複雜度對某建成的樹是固定的。

3,hash索引

hash索引只支援精確查詢,不支援範圍查詢。hash演算法函式有可能不能保證雜湊值的唯一性,即使是crc32這樣的函式。所以可能有雜湊碰撞問題(不同的串得到相同的hash值),md5()和sha1()是強加密函式,不會產生雜湊碰撞。

相關推薦

原理資料結構-索引 && 應用MySQL索引背後資料結構演算法原理

特點簡介: 索引檔案比資料檔案小,可以有效地裝載到記憶體。通過對記憶體索引檔案的查詢定位到記錄,然後通過一次磁碟物件讀取操作就可以獲取到需要搜尋的物件。 靜態索引結構和動態索引結構啥區別? 我認為靜態是指新節點的加入對原有的索引結構不會發生改變,比如:稠密索引直接把新節點

MySQL索引背後資料結構演算法原理

@rover這個是C++模板 --胡滿超 stack<Postion> path__;這個裡面 ”<> “符號是什麼意思?我在C++語言裡面沒見過呢? 初學者,大神勿噴。

誰說菜鳥不會資料分析(入門)----- 學習筆記2(結構為王確定分析思路 4P 5W2H )

1、資料分析方法論 確定分析思路需要以營銷、管理等理論為指導,把這些跟資料分析相關的營銷、管理等理論統稱為資料分析方法論。 資料分析方法論主要用來指導資料分析師進行一次完整的資料分析,更多的是指資料分析思路,如從哪方面開展資料分析?各方面包含什麼內容和指標。 資料分析方法論主要

誰說菜鳥不會資料分析(工具)----- 學習筆記2(結構為王確定分析思路)

1、資料分析方法論 確定分析思路需要以營銷、管理等理論為指導,把這些跟資料分析相關的營銷、管理等理論統稱為資料分析方法論。 資料分析方法論主要用來指導資料分析師進行一次完整的資料分析,更多的是指資料分析思路,如從哪方面開展資料分析?各方面包含什麼內容和指標。 資料分析方

微信技術分享微信的海量IM聊天訊息序列號生成實踐(演算法原理

1、點評 對於IM系統來說,如何做到IM聊天訊息離線差異拉取(差異拉取是為了節省流量)、訊息多端同步、訊息順序保證等,是典型的IM技術難點。 就像即時通訊網整理的以下IM開發乾貨系列一樣: 《IM訊息送達保證機制實現(一):保證線上實時訊息的可靠投遞》 《IM訊息送達保證機制實現(二

Java 資料結構2Stack原始碼

棧 棧,相信大家都非常熟悉了,先進先出,後進後出,又叫做LIFO(先進先出)表,一般棧的模型是,存在某個元素位於棧頂,而該元素是唯一的可見元素 棧的實現方式 1、通過單鏈表,通過在表的頂端插入實現樸實,通過刪除表頂端元素實現pop,top操作知識考察表

資料思維 第三資料分析的三板斧

令狐沖在華山學藝時,雖然勤學苦練,但是終不得法,在機緣巧合之下,得到風清揚老前輩的真傳,練成獨孤九劍之後,才名震江湖。雖然笑傲江湖的故事情節是虛構的,但從令狐沖蛻變的過程可以看出,練武需要祕籍。資料分析也有一本傳世祕籍,只有六字,這就是《資料化管理》中提到的六字箴言、資料分析的三板斧:對比、細分、溯源,具體來

MySQL索引背後資料結構演算法原理

作者 張洋 | 釋出於 2011-10-18 MySQL 索引 B樹 優化 摘要 本文以MySQL資料庫為研究物件,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援多種索引型

資料分析 第七相關分析

相關分析是資料分析的一個基本方法,可以用於發現不同變數之間的關聯性,關聯是指資料之間變化的相似性,這可以通過相關係數來描述。發現相關性可以幫助你預測未來,而發現因果關係意味著你可以改變世界。  一,協方差和相關係數 如果隨機變數X和Y是相互獨立的,那麼協方差 Cov(X,Y) = E{ [X-E(X)]

MySQL索引資料結構演算法原理

原文連結:MySQL索引背後的資料結構及演算法原理 本文以MySQL資料庫為研究物件,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援多種索引型別,如BTree索引,雜湊索引,全文索引等等。為了避

資料分析 第八OLS迴歸分析

變數之間存在著相關關係,比如,人的身高和體重之間存在著關係,一般來說,人高一些,體重要重一些,身高和體重之間存在的是不確定性的相關關係。迴歸分析是研究相關關係的一種數學工具,它能幫助我們從一個變數的取值區估計另一個變數的取值。 OLS(最小二乘法)主要用於線性迴歸的引數估計,它的思路很簡單,就是求一些使得實

MySQL索引背後資料結構演算法原理(employees例項)

摘要 http://blog.codinglabs.org/articles/theory-of-mysql-index.html 本文以MySQL資料庫為研究物件,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援

MySQL索引資料結構演算法原理學習筆記

1、預備知識 (1)儲存介質一般為主存和磁碟 (2)主存(RAM)支援隨機存取,磁碟定址需要定位【磁軌】和【扇區】,對應產生【尋道時間】和【旋轉時間】,因此磁碟的存取速度往往是主存的【幾百分之一】 (3)由於【區域性性原理】的歸納,以及磁碟IO非常耗時

資料分析 第十分類(kNN)

K最近鄰(kNN,k-NearestNeighbor)演算法是一種監督式的分類方法,但是,它並不存在單獨的訓練過程,在分類方法中屬於惰性學習法,也就是說,當給定一個訓練資料集時,惰性學習法簡單地儲存或稍加處理,並一直等待,直到給定一個檢驗資料集時,才開始構造模型,以便根據已儲存的訓練資料集的相似性對檢驗資料集

Cesium應用快速搭建

       範例中所有範例可以在Github中搜索:ExamplesforCesium        Cesium ['siːzɪəm]是一款開源的JavaScript開源庫,開發者通過Cesium,實現無外掛的建立三維球和二維地圖。Cesium通過WebGL技術實現圖形

資料分析 第九分類(kNN)

K最近鄰(kNN,k-NearestNeighbor)演算法是一種監督式的分類方法,但是,它並不存在單獨的訓練過程,在分類方法中屬於惰性學習法,也就是說,當給定一個訓練資料集時,惰性學習法簡單地儲存或稍加處理,並一直等待,直到給定一個檢驗資料集時,才開始構造模型,以便根據已儲存的訓練資料集的相似性對

【轉】MySQL索引背後資料結構演算法原理

摘要 本文以MySQL資料庫為研究物件,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援多種索引型別,如BTree索引,雜湊索引,全文索引等等。為了避免混亂,本文將只關注於BTree

Cesium應用1快速搭建

       範例中所有範例可以在Github中搜索:ExamplesforCesium        Cesium ['siːzɪəm]是一款開源的JavaScript開源庫,開發者通過Cesium,實現無外掛的建立三維球和二維地圖。Cesium通過WebGL技術實現圖形的硬體加速,並且跨平臺,跨瀏覽

Cesium應用3控制元件(4)Geocoder

Geocoder是一個非常簡單的控制元件,但也是非常常用且實用的控制元件,顧名思義,Geocoder就是地理編碼的意思,而平常我們經常會查詢一些地物,也就是常用的POI搜尋,就是Geocoder的功勞。 首先,該控制元件支援經緯度定位,比如如下,是北京京洲世家小

MySQL索引背後資料結構演算法原理

摘要 本文以MySQL資料庫為研究物件,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援多種索引型別,如BTree索引,雜湊索引,全文索引等等。為了避免混亂,本文將只關注