資料庫中索引相關基礎知識
阿新 • • 發佈:2021-07-22
索引的資料結構
B-Tree: 也稱為多路平衡查詢樹,並且所有葉子節點位於同一層。
B+Tree:它不僅具有 B-Tree 的平衡性,並且可通過順序訪問指標來提高區間查詢的效能。
MySQL 索引
索引,在MySQL也稱為鍵 (Key),是儲存引擎快速找到記錄的一種資料結構 。相當於圖書的目錄,可根據目錄中的頁碼快速找到所需的內容。
索引結構型別
- B+Tree 索引
- B+Tree 索引是大多數 MySQL 儲存引擎的預設索引型別。
- 因為 B+ Tree 的有序性 ,因此可用於部分查詢 、 範圍查詢 、 排序和分組 。
- 適用於全鍵值、鍵值範圍和鍵字首查詢,其中鍵字首查詢只適用於最左字首查詢。若不是按照索引列的順序進行查詢,則無法使用索引。
- Hash 索引
- Hash 索引能以 O(1) 時間進行查詢,但是失去了有序性。因此無法用於排序與分組,無法用於部分查詢和範圍查詢,只支援精確查詢。
- Hash 索引僅滿足 = , IN 和 <=> 查詢,不能使用範圍查詢。因為 Hash 索引比較的是Hash 運算後的 Hash 值,所以它只能用於等值的過濾。
- 全文索引
- 全文索引使用倒排索引實現,它記錄著關鍵詞到其所在文件的對映。
- 空間資料索引
- 空間資料索引會從所有維度來索引資料
索引的優點缺點
- 優點
- 大大減少了伺服器需要掃描的資料行數。
- 避免伺服器進行排序和分組操作,以避免建立臨時表 。
- B+Tree 索引是有序的,可以用於 ORDER BY 和 GROUP BY 操作。臨時表主要是在排序和分組過程中建立,不需要排序和分組,也就不需要建立臨時表。將隨機 I/O變為順序 I/O 。
- B+Tree 索引是有序的,會將相鄰的資料都儲存在一起。
- 缺點
- 索引並不是越多越好,索引固然可以提高相應的 SELECT 的效率,但同時也降低了INSERT及UPDATE 的效率,因為 INSERT 或 UPDATE 時有可能會重建索引 。
索引的設計原則
從索引的優、缺點考慮索引的設計原則。
- 忌過度索引 :
- 索引需要額外的磁碟空間,而且會降低寫操作的效能。
- 在修改表內容時,索引會進行更新甚至重構,索引列越多花銷時間越長。為此優化檢索效能,只保持需要的索引即可。
- 經常用在 排列 、 分組 和 範圍搜尋 的列適合建立索引,因為索引是有序的。
- 經常出現在 WHERE 子句的列,或是 JOIN 連線子句中指定的列適合建立索引。
- 使用短索引 :
- 若對長字串列進行索引,應該指定一個字首長度,這樣能夠節省大量索引空間
索引的優化策略
- 獨立的列:在進行查詢時,索引列不能是 表示式 的一部分,也不能是 函式引數,否則無法使用 索引。
- 多列索引: 在需要使用多個列作為條件進行查詢時,使用多列索引比使用多個單列索引效能更 好。
- 索引列的順序:讓選擇性最強的索引列放在前面。
- 字首索引:對於 BLOB、TEXT 和 VARCHAR 型別的列,必須使用字首索引,只索引開始的部分字元。字首長度的選取需要根據索引選擇性來確定。
- 覆蓋索引:索引包含所有需要查詢的欄位的值。具有以下優點:
- 索引通常遠小於資料行的大小,只讀取索引能大大減少資料訪問量。
- 一些儲存引擎在記憶體中只快取索引,而資料依賴於作業系統來快取。因此,只訪問索引可以不使用系統呼叫(通常比較費時)。
索引的使用場景
- 對於非常小的表:大部分情況下簡單的全表掃描比建立索引更高效;
- 對於中大型的表: 建立索引非常有效;
- 對於特大型的表:建立和維護索引的代價將會隨之增長。這種情況下,需要用到一種技術可以直接區分出需要查詢的一組資料,而不是一條記錄一條記錄地匹配。例如可以使用分割槽技術。