Mysql索引的資料結構及索引優化
阿新 • • 發佈:2021-12-05
索引的本質:是幫助Mysql高效獲取資料的排好序的資料結構。
索引資料結構
- 二叉樹
- 紅黑樹
- Hash表
- B-Tree
(1)、二叉樹:儲存資料的時候是一個連結串列,如果要查詢0006的話要查詢6次,如果是全表掃描的話也得查詢6次。
弊端:二叉樹的查詢效率很低。
(2)、紅黑樹:儲存資料的時候會自旋,如果要查詢0006的話只需要查詢3次。如果是全表掃描或二叉樹查詢的話需要6次,紅黑樹再二叉樹的基礎上查詢效率提高了一半。
弊端:當資料量很大的時候(幾百萬或幾千萬),樹的高度就會特別高,會存在多次磁碟IO操作影響其效能。解決以上的問題可以橫向擴充套件,分配節點的時候分配的大一些,讓其可以橫向儲存更多的索引元素。---- 此時B-Tree誕生了。
(3)、Hash: 對索引的key進行一次hash計算就可以定位出資料儲存的位置,很多時候Hash索引要比B+樹索引更高效。僅能滿足“=”,“IN”,不支援範圍查詢。會存在hash衝突的問題。
為什麼我們使用B+Tree比較多,使用hash比較少,是因為我們進行範圍查詢(select * from tabel where id > ***)的時候比較麻煩。
(4)、B-Tree:葉子節點具有相同的深度,葉子節點的指標為空;所有索引元素不重複;節點中的資料索引從左到右遞增排列。
(5)、B+Tree(B-Tree變種):非葉子節點不儲存data,只儲存索引(冗餘),可以放更多的索引;葉子節點包含所有索引欄位;葉子節點用指標連線,提高區間訪問的效能。
下面是關於儲存引擎索引的實現:
索引最左字首原理:
- 聯合索引的底層儲存結構長什麼樣子?
案例:最左字首法則,(排好序),根據聯合索引的欄位順序排好序。由於第2、3條sql沒有name,不是排好序的。需要全表掃描。