mysql 索引總結


1.索引的作用:提高數據查詢效率
2.常見索引模型:哈希表、有序數組、搜索樹
3.哈希表:鍵 - 值(key - value)。
4.哈希思路:把值放在數組裏,用一個哈希函數把key換算成一個確定的位置,然後把value放在數組的這個位置
5.哈希衝突的處理辦法:鏈表
6.哈希表適用場景:只有等值查詢的場景
7.有序數組:按順序存儲。查詢用二分法就可以快速查詢,時間複雜度是:O(log(N))
8.有序數組查詢效率高,更新效率低
9.有序數組的適用場景:靜態存儲引擎。
10.二叉搜索樹:每個節點的左兒子小於父節點,父節點又小於右兒子
11.二叉搜索樹:查詢時間複雜度O(log(N)),更新時間複雜度O(log(N))
12.數據庫存儲大多不適用二叉樹,因爲樹高過高,會適用N叉樹
13.InnoDB中的索引模型:B+Tree
14.索引類型:主鍵索引、非主鍵索引
主鍵索引的葉子節點存的是整行的數據(聚簇索引),非主鍵索引的葉子節點內容是主鍵的值(二級索引)
15.主鍵索引和普通索引的區別:主鍵索引只要搜索ID這個B+Tree即可拿到數據。普通索引先搜索索引拿到主鍵值,再到主鍵索引樹搜索一次(回表)。 
回到主鍵索引樹搜索的過程,我們稱爲回表。
16.一個數據頁滿了,按照B+Tree算法,新增加一個數據頁,叫做頁分裂,會導致性能下降。空間利用率降低大概50%。當相鄰的兩個數據頁利用率很低的時候會做數據頁合併,合併的過程是分裂過程的逆過程。
17.從性能和存儲空間方面考量,自增主鍵往往是更合理的選擇。

18. 覆蓋索引:如果執行的語句是 select ID from T where k between 3and5,這時只需要查ID的值,而ID的值已經在k索引樹上了,因此可以直接提供查詢結果,不需要回表。也就是說,在這個查詢裏面,索引k已經“覆蓋了”我們的查詢需求,我們稱爲覆蓋索引。說明:ID爲主鍵索引,k 爲普通索引
由於覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,所以使用覆蓋索引是一個常用的性能優化手段。

19. 聯合索引:B+樹這種索引結構,可以利用索引的“最左前綴”,來定位記錄。可以看到,不只是索引的全部定義,只要滿足最左前綴,就可以利用索引來加速檢索。這個最左前綴可以是聯合索引的最左N個字段,也可以是字符串索引的最左M個字符。
基於上面對最左前綴索引的說明,我們來討論一個問題:在建立聯合索引的時候,如何安排索引內的寧段順序。
這裏我們的評估標準是,索引的複用能力。因爲可以支持最左前綴,所以當已經有了(a,b)這個聯合索引後,一般就不需要單獨在a上建立索引了。因此,第一原則是,如果通過調整順序,可以少維護一個索引,那麼這個順序往往就是需要優先考慮採用的。

20. 下推索引:而MySQL5.6引入的索引下推優化(index condition pushdown),可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。

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