索引
幫助MySQL高效獲取數據的排好序
的數據結構
;
常見的索引結構
- 二叉樹
- 紅黑樹
- hash
- b-tree
- b+tree
索引真正使用的數據結構
二叉樹
缺點:一個節點只有兩個子節點,當數據量很大時,樹的深度很大,要進行多次查詢,而且容易造成兩邊不平衡。
紅黑樹
優點:解決了二叉樹不平衡的問題。
缺點:當數據量很大時 ,樹的深度還是很高。
hash
缺點:不能進行範圍查找。
b-tree
度(degree)- 節點的數據存儲個數
葉節點具有相同的深度
節點中的數據key從左到右遞增排列
優點:因爲度可以讓一個節點存儲多個數據,所以大大降低了樹的深度。
那是不是度越大越好呢?
答案:不是,當使用索引時,會把樹的節點數據從索引文件中讀取到內存中,這個讀取大小的單位和計算機有關,不過一定是頁(一般一頁是4k)的整數倍,如果一個節點的數據太大,就會多次向內存中加載數據,也就是進行多次IO操作,這是非常耗性能的。
b+樹
和b樹不同的是:
- b+樹非葉子節點中的數據是隻存儲key,不存儲數據,單個數據節點的大小減小,可以把樹的度設置的更大,從而減少查詢次數,提高查詢速度。
- b+樹葉子節點存儲key和value,從左到右升序排列,並且以指針相連,大大提高了範圍內查找的速度和效率。
索引實現
存儲引擎是設置在表級別的
Myisam索引實現(非聚集)
- Myisam索引文件和數據文件分離
在MySQL的data/mysql/目錄下一般一張表有三個文件:
.frm:表結構文件
.myd:數據文件
.myi:索引文件 - 索引文件葉子節點中value是數據在數據文件中的地址
- 主鍵索引與非主鍵索引存儲方式相同
InnoDB索引實現(聚集)
- InnoDB索引文件和數據文件放在一起
在MySQL的data/mysql/目錄下一般一張表有二個文件:
.frm:表結構文件
.idb:索引文件和數據 - InnoDB必須有主鍵,推薦是自增類型。如果沒有主鍵會自動從列中選一個列作爲主鍵,如果都不符合做主鍵的條件,則InnoDB會爲該表創建一個主鍵。
- 主鍵索引中value是數據(可以理解爲一條記錄)
- 非主鍵索引中value是主鍵索引中的主鍵。
- 爲什麼非主鍵索引不和主鍵索引一樣value中放置數據呢?
這就和事務有關了,如果value中都存儲數據,則進行更新和插入數據時,這兩個索引結構都要改變,而且還要實現事務的ACID特徵,不易實現,效率也不高。