1. 程式人生 > >mysql索引資料結構

mysql索引資料結構

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

 

  1. InnoDB索引實現(聚焦)
    • 表資料檔案本身就是按B+Tree組織的一個索引檔案

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

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

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

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

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

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

    • 聯合主鍵索引資料結構

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

 

  1. Hash索引實現
    • 首先將索引的值作hash運算得到雜湊值,根據雜湊值可以直接獲取儲存此條記錄的磁碟檔案指標,此方法效率很高,但致命缺點是無法實現範圍查詢