MySql優化索引詳解(二)

一.索引的本質
理解:正確的創建合適的索引是數據庫優化的基礎,索引是爲了加速對錶中數據行的檢索而創建的一種分散存儲數據結構
1.在RDBMS系統(關係型數據庫管理系統)中數據的索引都是硬盤級索引 硬盤級索引:大部分索引都存放在硬盤中,少部分會放在緩存中
解釋:
在這裏插入圖片描述
如果建立了索引,先會到索引目錄中存儲的指針找到對應的硬盤地址,然後根據硬盤地址找對應的表內容
INNODB 引擎中有HASH索引還有BETREE索引
hash索引的優劣勢?
查詢快 缺點:不支持範圍查詢(key進行hashCode可以得到數組的下標)
是否存在自適應Hash索引?
官方文檔上面顯示的是沒有,但是隨着索引查詢,他會自己建立一個key Value的緩存區,key就是主鍵索引
Mysql採用的數據結構?
Mysql底層採用的索引數據結構是B+樹結構
二.各種數據結構以及縮影的推演過程
mySql爲什麼選擇B+tree?
先來排除一下爲什麼不使用其他的樹狀結構
1.二叉搜索樹
二叉樹是n(n>=0)個結點的有限集合,該集合或者爲空集(稱爲空二叉樹),或者由一個根結點和兩棵互不相交的、分別稱爲根結點的左子樹和右子樹組成。
在這裏插入圖片描述
二叉樹特點:
由二叉樹定義以及圖示分析得出二叉樹有以下特點:
1)每個結點最多有兩顆子樹,所以二叉樹中不存在度大於2的結點。
2)左子樹和右子樹是有順序的,次序不能任意顛倒。
3)即使樹中某結點只有一棵子樹,也要區分它是左子樹還是右子樹。

在這裏插入圖片描述
如果是正常數據 二分查找左小右大命中數據,如果是不規則數據。 比如 A,C,F,J這種分支都在右邊,查找就相當於全表查找了
2.平衡二叉樹:定義:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。這個方案很好的解決了二叉查找樹退化成鏈表的問題,把插入,查找,刪除的時間複雜度最好情況和最壞情況都維持在O(logN)。但是頻繁旋轉會使插入和刪除犧牲掉O(logN)左右的時間,不過相對二叉查找樹來說,時間上穩定了很多。
在這裏插入圖片描述
通過右旋解決上面不規則數據的問題,但是要不停的計算
相對於二叉搜索樹多了一個數據區,查找方法與二叉搜索樹類似。數據區中存儲的可能是指針,也可能是數據。
二叉樹存在的缺陷:
1.樹的高度太高,就是如果存在太多數據,會不停的找下去
2.沒有利用好操作系統跟磁盤的IO交互特性,操作系統查找數據是按照頁查找的,假設每次查找的數據大小爲4K,但是使用二叉樹做一次IO操作只能拿到一個關鍵字兩個字節點引用,和一個數據區,極大的浪費了空間
3.多路平衡樹(B-樹)
性質:
(1)每個節點最多擁有m個子樹
(2)根節點最少有2個子樹
(3)分支節點最少擁有m/2棵子樹
(4)所有葉節點都在同一層,每個節點最多有m-1個key,並且以升序排列
在這裏插入圖片描述
(1)獲取根節點的關鍵字進行比較,當前根節點關鍵字爲M,E要小於M(26個字母順序),所以往找到指向左邊的子節點(二分法規則,左小右大,左邊放小於當前節點值的子節點、右邊放大於當前節點值的子節點);
(2)拿到關鍵字D和G,D<E<G 所以直接找到D和G中間的節點;
(3)拿到E和F,因爲E=E 所以直接返回關鍵字和指針信息(如果樹結構裏面沒有包含所要查找的節點則返回null);
關鍵字D,G 根據字節碼排序
空間劃分分別是 負無窮大–>D,D,D–>G,G,G–>無窮大
公式:關鍵字個數=子節點的路數-1
多路平衡樹可以解決二叉樹的問題,第一個高度問題,從瘦高–>矮胖,第二個內存的問題,能很好的利用內存
4.加強版多路平衡樹(B+樹)
(1)B+跟B樹不同B+樹的非葉子節點不保存關鍵字記錄的指針,這樣使得B+樹每個節點所能保存的關鍵字大大增加;
(2)B+樹葉子節點保存了父節點的所有關鍵字和關鍵字記錄的指針,每個葉子節點的關鍵字從小到大鏈接;
(3)B+樹的根節點關鍵字數量和其子節點個數相等;
(4)B+的非葉子節點只進行數據索引,不會存實際的關鍵字記錄的指針,所有數據地址必須要到葉子節點才能獲取到,所以每次數據查詢的次數都一樣;
在這裏插入圖片描述
關鍵字採用左閉合區間,主節點,子節點沒有數據區查詢的索引值就算是等於子節點值也不會停留,會一直走下去,直到葉子節點,進行查詢,所有數據區都會在葉子節點
例如關鍵字5,28,65
空間劃分:5<= x <28,28<=x<65 65<=x
優點:
1.IO能力強於B樹,因爲加載的磁盤塊沒有數據區了,所有加載的數據會更多,會更加精準;2.基於索引結構,掃庫,掃表能力強於B樹,只掃葉子節點,B樹需要掃所有滿足條件的子節點,以便獲取數據
3.底層是雙向鏈表結構,就是首個葉子節點的末尾值,指向下一個葉子節點的首部值,天然有序強於B樹的排序;4.查詢性能會更穩定,強於B樹,B樹獲取索引值的時候,如果子節點沒有,會一直找下去,直到找到後,命中,相應的每個磁盤加載的空間和時長不確定,有的耗時長,有的耗時短。而B+樹,他就算是獲取的索引值等於子節點,也不會停留,最終會到葉子節點查詢。
B+樹相比於B樹及其他樹形數據結構來說,更適合用來做存儲索引,原因如下:
1.B+ 樹的磁盤讀寫代價更低,B+ 樹由於非葉子節點只會存儲索引,因此B+ 樹的非葉子節點相對於B 樹來說更小,如果把所有同一內部節點的關鍵字存儲在同一盤塊中,那麼該盤塊所能容納的關鍵字數量也越多,一次性讀入內存中的關鍵字也就越多,相對來說IO讀寫次數也就降低了
2.B+ 樹的查詢效率更加穩定,因爲具體數據存儲在葉子節點中,所以無論查詢任何數據都需要從根節點走到葉子節點,那麼所有查詢的長度也就相同,這樣每個數據查詢的效率就幾乎是相同的
3.B+ 樹更有利於對數據庫的掃描,B 樹在提高了磁盤IO的同時並沒有解決遍歷元素效率低下的問題,而B+ 樹只需要遍歷葉子節點就可以解決對全部關鍵字信息的掃描,所以對數據庫中頻繁使用的範圍查詢來說B+ 樹更高效
三.MySql如何落地B+Tree索引
Myisam:會生成2個文件,後綴myi,存放索引的,myd:存放數據的,查詢時先查詢索引,查到對應的索引後,根據索引對應的指針去找對應指針存儲的數據
innodb:只生成一個文件,後綴myd
在這裏插入圖片描述
INNODB中的主鍵索引(聚集索引)最末尾保存的內容,就是這條數據的值,輔助索引:保存的是主鍵索引的值,爲什麼不保存地址呢?因爲二叉樹爲了保證樹的絕對平衡會不停分裂合併來改變數據的存儲位置,如果存的是地址的話,設置完主鍵索引的值以後,還有來維護輔助索引的值,消耗更大。INNODB中核心索引是:主鍵索引
四.索引機制中很重要的原則
1.列的離散性
比值越高離散性越好,就是重複率越低,離散性越好
若列的離散性越好,列的選擇性就越好,選擇性越好的列作爲索引更合適,離散性很差的列作爲索引可能會適得其反 公式:count(distinct name):count(name)
2.最左匹配原則
簡而言之,對索引項中的關鍵字對比,一定是從左往右依次進行
3.聯合索引
如果是單列索引的話,就是一個列就是用一個關鍵字做的索引,如果是聯合索引的話,就是一個列中有多個關鍵,用特殊字符 逗號拼接起來的一個索引
4.覆蓋索引
通過索引項的信息可直接返回所需的查詢列,則該索引稱之爲查詢SQL的覆蓋所有
5.三星索引
第一顆星:where後條件匹配的索引關鍵字列越多掃描的數據將越少
第二顆星:避免再次排序
第三顆星:儘可能運用到覆蓋索引進行數據的掃描,減少回表IO操作
思考
1.數據結構的性能特點,決定了數據庫的檢索性能?
是的,因爲數據結構查詢性能越高,數據庫檢索就越快,B+樹的結構就是
2.索引額外問題之索引是建立越多越好嗎?
答案是否定的,所謂物極必反:
數據量小的表不需要建立索引,建立索引會增加額外的索引維護開銷
數據變更需要維護索引,因此更多的索引意味着更多的維護成本
更多的索引也意味着需要更多的存儲空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章