MySQL索引及索引數據結構

索引是幫助MySQL高效獲取數據的排好序數據結構

  • 主鍵和unique約束的字段會自動添加索引(根據主鍵查詢效率較高,儘量根據主鍵檢索)

  • 索引操作

    • 添加索引 create index 索引名 on 表名(字段名);
    • 刪除索引 drop index 索引名 on 表名(字段名);
  • 索引分類:

    • 單一索引:給單個字段添加索引
    • 聯合索引:多個字段聯合起來添加一個索引
    • 主鍵索引:主鍵上會自動添加索引
    • 唯一索引:unique約束的字段會自動添加索引
  • 索引失效的情況:

    模糊查詢時,第一個查詢字符是不確定值(’%‘或’_’)時,索引失效

    select name from stu where name like '%e%'; 索引失效

    select name from stu where name like 'h%'; 索引有效


數據結構

  • 索引數據結構

    • 二叉樹
    • 紅黑樹
    • Hash表
    • B-Tree樹

  • 紅黑樹結構:
    在這裏插入圖片描述

  • Hash表:效率高,但是無法支持範圍查找

  • B-Tree結構

    • 葉節點具有相同的深度,葉節點的指針爲空
    • 所有索引元素不重複
    • 節點中的數據索引從左到右遞增排列
      在這裏插入圖片描述

  • B+Tree (B-Tree變種)

    • 非葉子節點不存儲data,只存儲冗餘索引,可以存放更多的索引

    • 葉子節點包含所有的索引字段

    • 葉子節點用指針連接,提高區間訪問的性能
      在這裏插入圖片描述

MyISAM存儲引擎索引實現

MyISAM索引文件和數據文件是分離的(非聚集)

  • .frm文件 存儲表結構和數據定義的信息

  • .MYD 存儲數據

  • .MYI 存儲索引

  • 在使用了索引查找的情況下,先在MYI文件中定位到目標節點,再去MYD文件快速查找
    在這裏插入圖片描述

InnoDB索引實現

  • 表數據文件本身就是按B+Tree組織的一個索引結構文件

  • 聚集索引 - 葉節點包含完整的數據記錄

在這裏插入圖片描述

  • 爲什麼InnoDB必須有主鍵,並且推薦使用整型的自增主鍵?
    • 需要一個主鍵索引,用B+Tree來組織維護數據。
    • 沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作爲主鍵索引。
    • 如果沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作爲隱含的聚集索引(ROWID隨着行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)
    • 使用自增列(INT/BIGINT類型)做主鍵,這時候寫入順序是自增的,和B+Tree葉子節點分裂順序一致,無須頻繁的移動、分頁操作。
  • 爲什麼非主鍵索引結構葉子節點存儲的是主鍵值?
    • 保持一致性:當數據庫表進行DML操作時,同一行的頁地址會發生改變,因非主鍵索引保存的是主鍵的值,無需進行更改。
    • 節省存儲空間:InnoDB數據本身就已經匯聚到主鍵索引所在的B+Tree上了,如果普通索引還繼續保存一份數據,就會導致有多少索引就要存多少份數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章