mysql索引資料結構
阿新 • • 發佈:2020-10-13
- 索引是幫助mysql高效獲取資料的排好序的資料結構
- B+Tree(B-Tree)
- 非葉子節點不儲存data,只儲存索引(冗餘),可以放更多的索引
- 葉子節點包含所有索引欄位
- 葉子節點用指標連線(雙向)-便於範圍查詢,提高取件訪問的效能
- MYISAM索引檔案和資料檔案是分離的(非聚集),一個表包含MYD(資料),MYI(索引),frm(表結構)三個檔案
- 判斷where後的條件是否是索引欄位,否則全表掃描
- 是索引欄位,在MYI檔案索引的根目錄下查詢目標值,獲取該條資料的磁碟檔案地址
- 根據地址在MYD檔案獲取該資料
- InnoDB索引實現(聚焦)
- 表資料檔案本身就是按B+Tree組織的一個索引檔案
- 聚集索引-葉節點包含了完整的資料記錄,非聚集索引-葉節點包含了資料的地址
InnoDB是聚集索引,MYISAM是非聚集索引,聚集索引相比非聚集索引查詢效率要高一些
- 為什麼InnoDB表必須有主鍵,並且推薦使用整型的自增主鍵?
如果沒有建立主鍵,mysql會對資料表的列從左到右進行查詢,找到符合唯一索引的列作為主鍵處理,如果沒有這樣的列,mysql會新增一個隱藏列;使用整型的自增主鍵比較大小更快,且佔用的儲存空間更小(如uuid,字串比較大小更復雜,且佔用的儲存空間更大)
- 為什麼非主鍵索引結構葉子節點儲存的是主鍵值?(一致性和節省儲存空間)
非主鍵索引先根據索引列找到主鍵值,再根據主鍵值掃描主鍵索引樹,一共掃描兩棵索引樹
- 聯合主鍵索引資料結構
首先比較第一列索引的值,如第一列的值相同,再比較第二類索引的值,以此類推
- Hash索引實現
- 首先將索引的值作hash運算得到雜湊值,根據雜湊值可以直接獲取儲存此條記錄的磁碟檔案指標,此方法效率很高,但致命缺點是無法實現範圍查詢