myesn

myEsn2E9

hi
github

MySQL 索引

簡略總結#

  • 索引幫助存儲引擎快速獲取數據的一種數據結構,即數據的目錄(就像書的目錄一樣),以空間換時間的設計思想
  • 分類
    • 按 [數據結構]: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
    • 按 [字段個數]:單列索引、聯合索引
      • 單列索引:建立在單列上
      • 聯合索引:建立在多列上
  • 索引適用案例
    • 字段值唯一性,比如商品編碼
    • 經常用於 where 查詢條件的字段
    • 經常用於 group by 和 order by 的字段
  • 索引不適用案例(反例)
    • where 條件、group by、order by 裡用不到的字段
    • 字段中存在大量重複數據(即值分布均勻),比如性別
    • 數據太少時
    • 經常更新的字段
  • 索引優化
    • 前綴索引優化
    • 覆蓋索引優化
    • 主鍵索引最好自增
    • 索引列設置 NOT NULL
    • 防止索引失效

參考#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。