MySQL索引詳解
一. 索引的作用
索引的作用:提高數據查詢的效率。如果沒有索引,每次查詢數據都需要掃描全表。
二. 索引的常見模型
- 哈希表:以key-value的形式保存數據。
- 優點:查詢速度很快 O(1)
- 缺點:只適用於等值查詢的場景,無法進行模糊查詢和範圍查詢。
- 有序數組
- 優點:採用二分查找,等值查詢和範圍查詢的效率都比較高O(logn)
- 缺點:插入或者更新數據時,需要移動元素,效率很低。因此僅適用於靜態存儲引擎(數據幾乎不會改變)
- B+樹
三. InnoDB的索引模型
- 每個索引在InnoDB裏面都對應一顆B+樹
- 主鍵索引的葉子節點存放的是整行數據。主鍵索引也被成爲聚簇索引。
- 非主鍵索引的葉子節點存放的是主鍵的值。非主鍵索引也被成爲二級索引。
- 基於主鍵查詢時,只需要搜索主鍵所在的索引B+樹即可。
- 基於非主鍵查詢時,需要首先搜索非主鍵索引樹,再搜索主鍵索引樹。這個過程稱爲回表。因此,查詢時儘量使用主鍵索引,可以減少一次查詢。
四. 爲什麼推薦使用自增主鍵
- 基於自增主鍵,每次插入主鍵時都是在B+樹種遞增插入——每次插入一條數據,都是追加操作,不涉及到移動其他記錄,也不會觸發葉子節點的分裂。
- 使用自增主鍵,一般爲int(4字節)或bigint(8字節),所佔空間較小。
- 如果沒有顯示自增主鍵,InnoDB會選擇一個int型或bigint型的unique_key作爲主鍵。如果找不到unique_key,則會爲該表自動生成一個自增主鍵。
五. 覆蓋索引
- 查詢時,儘量讓索引字段覆蓋查詢需求,稱爲覆蓋索引。
- 由於覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,所以使用覆蓋索引是一個常用的性能優化手段。
六. 最左前綴原則
- 最左前綴:可以是聯合索引的最左 N 個字段,也可以是字符串的最左M個字符
七. 索引下推
MySQL 5.6引入了索引下推優化,可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。
八. 重建索引
索引可能因爲刪除,或者頁分裂等原因,導致數據頁有空洞,重建索引的過程會創建一個新的索引,把數據按順序插入,這樣頁面的利用率最高,也就是索引更緊湊、更省空間。
但是刪除主鍵或者創建主鍵的操作,會將整個表重建,要慎重。