1. 程式人生 > 其它 >Mysql的索引原理

Mysql的索引原理

查詢的歷程

線性查詢
HASH:冗餘的陣列實現的,查詢快,但佔用空間
B+樹和二叉樹有什麼區別
二叉樹:插入和查詢很快(logn),無法存大規模資料,複雜度退化
平衡樹:解決bst退化的問題,樹是平衡的;節點非常多的時候,依然樹高很高
多路查詢樹:一個父親多個孩子節點(度);節點過多樹高不會特別深
多路平衡查詢樹:B-Tree(構建索引的底層結構)

階數

二叉樹中階數的概念:
二叉樹的階數是一個節點的子節點數目的最大值
Tips:度和階數在定義層面上不同,但實際的數值有可能相同(一般都相同),度是從某一節點去做的定義。階是從B樹做的整體定義。

為什麼使用B+樹作為索引的底層結構

B+樹是B-Tree的變形
只在葉子節點帶有指向記錄,葉子節點儲存資料,非葉子節點可以有更多的孩子節點,更加矮胖(階數更多或者度更多)

階數不能越多越好

階不能越多越好,記憶體管理單位是以頁,階是以磁碟塊的大小來決定的。
為了作業系統更好的快取和讀取資料,所以階數不可以越多越好。

什麼時候用索引

經常出現在order by group by 之後的欄位
非空欄位NOT NULL,Mysql很難對空值作查詢優化(一般都需要有預設值)
區分度高,離散度大,作為索引的欄位值儘量不要有大量相同值

使用索引的注意事項

索引一般使用的是索引是id,也就是自增的Int值,若是字串的化一定要指定長度(不要太長),不然就會很耗費時間。(索引的值作為Key存在的,太長會導致一個頁當中能夠存放的 key 的數目變少,間接導致索引樹的頁數目變多,索引層次增加,從而影響整體查詢變更的效率),

索引什麼時候失效:

以%開頭的LIKE語句,模糊搜尋
模糊匹配、型別隱式轉換(Python動態語言查詢中需注意)
沒有滿足最左字首(沒有辦法直接比較)
原因:
Mysql B+樹的key無法比較的時候就失效

聚集索引,非聚集索引

聚集還是非聚集指的是B+Tree葉子節點存的是指標還是資料記錄;沒有儲存資料非聚集(非聚集儲存的是指定(資料記錄的地址))
MyISAM索引和資料分離,使用的是非聚集索引
InnoDB資料檔案就是索引檔案,主鍵索引就是聚集索引