簡略總結#
- 索引:幫助存儲引擎快速獲取數據的一種數據結構,即數據的目錄(就像書的目錄一樣),以空間換時間的設計思想
- 分類:
- 按 [數據結構]:B+Tree 索引、Hash 索引、Full-text 索引
- InnoDB 引擎不支持 Hash 索引
- 創建的主鍵索引和二級索引默認使用的是 B+Tree 索引
- 按 [物理存儲]:聚簇索引(主鍵索引)、二級索引(輔助索引)
- 主鍵索引的 B+Tree 的葉子節點存放的是實際數據,所有完整的數據記錄都存放在主鍵索引的 B+Tree 的葉子節點裡
- 二級索引的 B+Tree 的葉子節點存放的是主鍵值,而不是實際數據
- 查詢時使用二級索引:
- 能在二級索引的 B+Tree 裡查到就叫覆蓋索引(僅查詢二級索引的 B+Tree)
- 查不到就還要去聚簇索引的 B+Tree 裡面查,這個過程叫回表(先查詢二級索引的 B+Tree 拿主鍵值,再去主鍵索引的 B+Tree 查詢真正的數據)
- 查詢時使用二級索引:
- 按 [字段特性]:主鍵索引、唯一索引、普通索引、前綴索引
- 主鍵索引:建立在主鍵字段上的索引,一張表只能有一個主鍵索引,索引列的值不允許為空
- 唯一索引:建立在 UNIQUE 字段上的索引,一張表可以有多個唯一索引,索引列的值必須唯一,允許有空值
- 普通索引:建立在普通字段上的索引,不要求字段為主鍵,也不要求字段為 UNIQUE
- 前綴索引:指對字符串類型字段的前幾個字符建立的索引,而不是整個字段上建立的索引,節省索引存儲空間,提升查詢效率
- 允許的字段類型:char、varchar、binary、varbinary
- 按 [字段個數]:單列索引、聯合索引
- 單列索引:建立在單列上
- 聯合索引:建立在多列上
- 按 [數據結構]:B+Tree 索引、Hash 索引、Full-text 索引
- 索引適用案例:
- 字段值唯一性,比如商品編碼
- 經常用於 where 查詢條件的字段
- 經常用於 group by 和 order by 的字段
- 索引不適用案例(反例):
- where 條件、group by、order by 裡用不到的字段
- 字段中存在大量重複數據(即值分布均勻),比如性別
- 表數據太少時
- 經常更新的字段
- 索引優化:
- 前綴索引優化
- 覆蓋索引優化
- 主鍵索引最好自增
- 索引列設置 NOT NULL
- 防止索引失效