認識自己的無知是認識世界最可靠的方法(`・ω・´) 開局一張圖
做個實驗: 問問你周邊的小夥伴 索引是什麼?我周邊的小夥伴是下面的表情,平時在用的時候大部分人都知道它能夠加速查詢,但是至於定義嘛,往往被忽略。
mysql官方:索引(index)是幫助mysql高效獲取資料的一種資料結構。mysql的查詢本質也就是找資料,如果選擇了鍊錶結構的話每次查詢的時間複雜度都是o(n)。所以在實現索引時選擇合適的資料結構非常重要。
要理清楚這個問題需要知道影響查詢速度的幾個重要因素。
q1:索引儲存在記憶體還是外存 ?本科階段有一門課程叫做計算機組成原理,在計算機儲存的章節應該介紹了計算機從記憶體讀取資料和從外存讀取資料的區別,最為明顯的區別就是讀取的速度,從記憶體讀取速度遠快於從外存讀取。我們要知道mysql的索引是不可能一直儲存在記憶體中的,所以所以的物理儲存方式是儲存在外存中。可以開啟mysql安裝路徑資料夾中得到驗證
其中【.myi】結尾的檔案儲存的就是索引檔案。
q2:外存讀取資料的過程 ?磁碟的物理結構圖
上圖所示是磁碟的物理結構,硬碟的讀寫以扇區為基本單位。磁碟上的每個磁軌被等分為若干個弧段,也就是圖中磁軌上的一小塊陰影部分,這些弧段稱之為扇區。
特點
磁碟i/o是屬於機械操作,讀取速度 【磁碟 >> 記憶體】
切磁頭不能旋轉,只能沿著磁碟做斜切向運動來讀取扇區部分的資料
在讀取資料過程中為了確定資料在那個扇區,需要將磁頭移動到對應扇區所在的磁軌上,這個過程消耗時間叫【尋道時間】
接著磁碟通過旋轉的方式將目標扇區旋轉到磁頭下面,這個過程消耗的時間叫【旋轉延遲】
為了加快查詢的速度我們儘量減少這兩個時間,其中 旋轉延遲 是由磁碟本身的物理特性決定的,我們能做的就是改變資料的查詢方式來減少尋道時間。
扇區是磁碟的物理概念,作業系統是不直接與扇區互動的,而是與多個連續扇區組成的磁碟塊進行互動。
區域性性原理
依據區域性性原理,磁碟通常不僅僅是按需讀取,每次都會預讀,即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。
扇區是磁碟最小的物理儲存單元,作業系統將相鄰的扇區組合在一起,形成乙個塊也叫作頁(page)對塊進行管理,乙個塊(頁)的大小通常是4k。
主存和磁碟以頁為單位交換資料,預讀的長度一般為頁(page)的整倍數。
當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。
小結: 因為索引檔案是儲存在外存的,由於計算機讀取外存的機制導致大量時間花費在尋道上。目標: 選擇一種合理的資料結構(儲存結構),要求充分利用儲存的區域性性原理、時間複雜度最低。基於雜湊表實現,對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼(hash code),並且hash索引將所有的雜湊碼儲存在索引中,同時在索引表中儲存指向每個資料行的指標。缺陷:雜湊索引資料並不是按照索引列的值順序儲存的, 所以不能利用區域性性原理。
基於btree的實現意味著所有的值都是按照順序儲存的,從根節點出發到每個葉子節點的距離相同。
下圖是btree的示意圖,其中的數字可以理解為索引關鍵字,但是節點中除了儲存索引關鍵字之外還會儲存資料。
b-tree 查詢時需要從索引的根節點開始進行搜尋。根節點的槽中存放了指向子節點的指標,儲存引擎根據這些指標向下層查詢。
通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點,這些指標實際上定義了子節點頁中值的上限和下限。
最終儲存引擎要麼是找到對應的值,要麼該記錄不存在。
缺陷:因為btree的每個結點都會儲存索引關鍵字和對應的資料,所以在有海量資料需要儲存的時候,乙個節點的儲存的資料有限,只能通過擴充套件樹的高度來儲存資料,所以btree的樹高來越大。意味著需要查詢的時間更久。
基於b+ tree的實現意同樣意味著所有的值都是按照順序儲存的,b+tree 可以看做是btree的一種改進。和btree不同的是
根據上述特性可知:
資料結構
優點缺點
hash
查詢指定的資料非常快
不能利用區域性性原理。
btree
非葉子結點儲存具體資料,在查詢某個關鍵字的時候找到即可返回
資料量大的時候樹高會很大
hash
樹高小,效率高,非常適合範圍查詢
葉子結點中會冗餘乙份非葉子結點的關鍵字
下篇挖坑:面試常問——mysql中的那幾把鎖。你心裡有沒有點B樹?
b樹,是一種多路平衡搜尋樹,多用於檔案系統 資料庫的實現。b樹中所有節點擁有的子節點數 指標數 的最大值稱為b樹的階,如3階b樹他的子節點個數最大為3個。可以通過這個視覺化資料結構 自己對照模擬一遍,會更容易掌握的。選擇b trees,就可以進入到頁面建立b樹了,選擇相應的階數即可。點這裡,進入視覺...
什麼面試官問的B樹 B 樹 B 樹,你還不懂?
1.1.1 二叉樹的問題分析 二叉樹的操作效率較高,但是也存在問題,請看下面的二叉樹 二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 比如 1 億 就存在如下問題 問題 1 在構建二叉樹時,需要多次進行 i o 操作 海量資料存在資料庫或檔案中 節點海量,構建二...
3 4 優化你的索引 運用b 樹
定義呢,基本與b樹相同,除了 非葉子節點的子樹,關鍵字的個數與指標是相同的。對比,比b樹存的資料更多 b 樹 1.1 關鍵字的個數與指標是相同的。1.2 葉子節點才 儲存實際資料。每次資料查詢都是從根到葉子,查詢時間複雜度很穩定,都是二分查詢o logn n是資料總數。1.3 非葉子節點 存索引資料...