天天看點

Mysql-索引詳解

Mysql索引詳解

      • 1. 為什麼Mysql底層選擇B+樹作為資料結構?
      • 2. Mysql索引節點
      • 3. 存儲引擎
      • 4. myisam引擎内容
      • 5. InnoDB引擎内容
      • 6. 索引優化

1. 為什麼Mysql底層選擇B+樹作為資料結構?

1. 二叉樹:容易轉換為連結清單。
2. 紅黑樹:資料層數太高。(二叉平衡樹)
3. B+ Tree: 多叉平衡樹。 索引節點是從左向右升序排列。
	1.  
4. B- Tree
	1. 葉節點具有相同的深度,葉節點的指針為空。
	2. 所有索引元素不重複。
	3. 節點中的資料索引從左至右遞增排列。
           

2. Mysql索引節點

1. 一個索引節點配置設定16KB大小。
2. 索引資料和區間索引位址(兩個索引節點之間的資料所在的記憶體位址)構成。
3. MySQL根節點索引是常駐在記憶體中。
4. 每一次IO操作,都會擷取一個索引節點。
           

3. 存儲引擎

1. 存儲引擎是針對資料表,不是針對資料庫的一個庫中可以存儲不同存儲引擎的資料表。
           

4. myisam引擎内容

  1. 存儲資料相關檔案:
    1. tableName.frm:存儲table的表結構。
    2. tableName.MYD:存儲table中的資料。
    3. tableName.MYI:存儲table的索引。
  2. 查詢的過程
    1. 沒有索引:直接進行全表掃描。
    2. 存在索引:
      1. 查找索引(MYI檔案)。
      2. 根據索引中存儲的資料記憶體位址,在(MYD檔案)查找資料。
      3. 加載到記憶體中。
  3. 索引(非聚集索引)
    1. 索引檔案和資料檔案是分離的。
    2. 索引的葉子節點,存儲的是資料所在的記憶體位址。
      Mysql-索引詳解

5. InnoDB引擎内容

  1. 存儲資料相關檔案:
    1. tableName.frm: 存儲table的表結構。
    2. tableName.ibd:存儲table的索引以及資料。
  2. 面試題
    1. 為什麼InnoDB建議,必須建立主鍵,并且推薦使用整型的自增主鍵?
      1. InnoDB底層會根據主鍵,組建B+Tree的資料。
      2. 沒有建立主鍵時,InnoDB會在底層尋找一個不重複資料的列,作為主鍵索引,建構B+Tree的資料組成。若找不到合适列,Mysql會建立一個隐藏列,作為主鍵索引,建構B+Tree的資料組成。
      3. 推薦使用整型;是因為整型占用的存儲空間小,且容易比較大小(因為B+Tree是保證索引節點,是從左到右,依次遞增)。
      4. 使用自增;若主鍵時随意大小,那麼會導緻,葉子節點會進行分裂,且B+Tree會進行自平衡,降低效率。
    2. BTree和B+Tree的差別?
      1. Btree葉子節點沒有關聯;
      2. B+Tree葉子節點之後是使用雙向連結清單結構,互相關聯在一起的。
  3. Hash索引
    1. 定義:根據查找語句的字段,進行hash運算,得到磁盤對應的行存儲位址 。
    2. 優勢:對于=這樣的可以快速查詢。
    3. 劣勢:對于> or < 等等這種區域操作,則無法快速查詢資料。
  4. 索引(聚集索引):
    1. 索引檔案和資料檔案是在一起的。
    2. 索引的葉子節點,存儲的是對應索引的行完整資料。
    3. 聚集索引定義:就是索引的葉子節點,存儲的就是完整資料行。
    4. 葉子節點是資料結構是雙向指針;友善進行範圍的查找。
      Mysql-索引詳解
      Mysql-索引詳解

6. 索引優化

  1. 聯合索引的底層資料結構是怎麼樣的?
    1. 索引節點中,就會存儲多個字段的資料;然後資料節點中存儲其餘的字段資料。
    2. 比較大小:會一個一個字段進行比較,若第一個字段就能比較出大小,則不會進行後面字段的比較;是以,當我們使用索引時,若查詢的字段順序,不符合索引字段的順序,則無法使用索引。 eg: key(a, b, c); where b == 1 and a == 2 and c==1, 依然會被Mysql底層,優化使用到索引。除非,where中不含a開頭,就會無法使用索引。
      Mysql-索引詳解

繼續閱讀