天天看點

資料庫索引原理

目錄

  • 索引可以用的查找算法
    • 一、雜湊演算法
    • 二、二叉排序樹
    • 三、紅黑樹
    • 四、B+樹
  • MySQL索引存儲
    • 一、myisam引擎(非聚集索引方式)
    • 二、INNODB 引擎(聚集索引方式)

筆記來源:源碼學院

索引(Index)是幫助 MySQL 高效擷取資料的資料結構。 常見的查詢算法:順序查找、二分查找、二叉排序樹查找、哈希散列法、分塊查找、平衡多路搜尋樹 B 樹(B-tree)
資料庫索引原理

雜湊演算法(也叫散列), 就是把任意長度值(Key)通過雜湊演算法變換成固定長度的key位址,通過這個位址進行通路的資料結構。

它通過把關鍵碼值映射到表中一個位置來通路記錄,以加快查找的速度。

這個映射函數叫做散列函數,存放記錄的數組叫做散清單。

資料庫索引原理
資料庫索引原理

比如對于SQL語句:

select * from user where id = 7
           

很快就可以獲得id=7的實體位址:

hash時間複雜度:O(1)

為什麼MySQL索引沒将hash算法作為主流?

# hash算法很适用于
select * from user where id = 7

# 但是對于以下情況,就力不從心了
select * from user where id < 7
           
Hash不支援範圍查詢和排序

資料庫索引原理

如果是【平衡二叉樹】,查詢id=7,則查詢了 3 次

但如果平衡二叉樹是以下這種情況【傾斜二叉樹】:

資料庫索引原理

如果查詢id=7,則查詢了 7 次【樹的深度對查找次數有影響】

解決二叉樹的平衡的問題,但是mysql索引依然沒有使用紅黑樹

問題:沒有絕對解決,還是有傾斜現象

資料庫索引原理

真實的資料存在于葉子節點;非葉子節點不存儲真實的資料,隻存儲指引搜尋方向的資料項。
資料庫索引原理

當資料增加時,B+樹會橫向擴容,很難增加樹的深度

資料庫索引原理
select * from user where id = 7
           

查詢到7,隻需要查詢3次即可

是以B+樹非常适合做索引的底層資料結構【Hash算法有時也會做,因為時間複雜度低】

資料庫的索引會存儲到磁盤

  • frm:建立表的語句檔案
  • MYD:資料庫資料檔案
  • MYI:資料庫索引檔案

因為資料和索引是分開的,是以是非聚集的。

myisam不支援事務

比如以下圖。我們對id和username建立了索引,則我們對id和username的索引都建立了對應的存儲檔案:

資料庫索引原理

  • ibd:資料庫資料+索引檔案
INNODB查詢速度不快

比如以下圖。我們對id和username建立了索引

  • 第一個IBD索引資料檔案記錄了id和資料
  • 第二個IBD索引檔案,如果對username也建立了索引,則記錄的是username的索引和對應的id,為了節省空間,不存儲資料