mysql索引數據結構

  1. 索引是幫助mysql高效獲取數據的排好序的數據結構
  2. B+Tree(B-Tree)
    • 非葉子節點不存儲data,只存儲索引(冗餘),可以放更多的索引
    • 葉子節點包含所有索引字段
    • 葉子節點用指針連接(雙向)-便於範圍查找,提高取件訪問的性能
      image
  1. MYISAM索引文件和數據文件是分離的(非聚集),一個表包含MYD(數據),MYI(索引),frm(表結構)三個文件
    1. 判斷where後的條件是否是索引字段,否則全表掃描
    2. 是索引字段,在MYI文件索引的根目錄下查找目標值,獲取該條數據的磁盤文件地址
    3. 根據地址在MYD文件獲取該數據

 

image

  1. InnoDB索引實現(聚焦)
    • 表數據文件本身就是按B+Tree組織的一個索引文件

image.png

    • 聚集索引-葉節點包含了完整的數據記錄,非聚集索引-葉節點包含了數據的地址

InnoDB是聚集索引,MYISAM是非聚集索引,聚集索引相比非聚集索引查詢效率要高一些

    • 為什麼InnoDB表必須有主鍵,並且推薦使用整型的自增主鍵?

如果沒有建立主鍵,mysql會對數據表的列從左到右進行查找,找到符合唯一索引的列作為主鍵處理,如果沒有這樣的列,mysql會新增一個隱藏列;使用整型的自增主鍵比較大小更快,且佔用的存儲空間更小(如uuid,字符串比較大小更複雜,且佔用的存儲空間更大)

    • 為什麼非主鍵索引結構葉子節點存儲的是主鍵值?(一致性和節省存儲空間)

截屏2020-10-12 下午6.53.05.png

非主鍵索引先根據索引列找到主鍵值,再根據主鍵值掃描主鍵索引樹,一共掃描兩棵索引樹

    • 聯合主鍵索引數據結構

截屏2020-10-12 下午7.02.08.png

首先比較第一列索引的值,如第一列的值相同,再比較第二類索引的值,以此類推

 

  1. Hash索引實現
    • 首先將索引的值作hash運算得到散列值,根據散列值可以直接獲取存儲此條記錄的磁盤文件指針,此方法效率很高,但致命缺點是無法實現範圍查找

截屏2020-10-12 下午7.12.08.png