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