資料庫索引原理
阿新 • • 發佈:2020-07-29
目錄
筆記來源:原始碼學院
索引(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+樹
真實的資料存在於葉子節點;非葉子節點不儲存真實的資料,只儲存指引搜尋方向的資料項。
當資料增加時,B+樹會橫向擴容,很難增加樹的深度
比如對於SQL語句:
select * from user where id = 7
查詢到7,只需要查詢3次即可
所以B+樹非常適合做索引的底層資料結構【Hash演算法有時也會做,因為時間複雜度低】
MySQL索引儲存
資料庫的索引會儲存到磁碟
一、myisam引擎(非聚集索引方式)
- frm:建立表的語句檔案
- MYD:資料庫資料檔案
- MYI:資料庫索引檔案
因為資料和索引是分開的,所以是非聚集的。
myisam不支援事務
比如以下圖。我們對id和username建立了索引,則我們對id和username的索引都建立了對應的儲存檔案:
二、INNODB 引擎(聚集索引方式)
- frm:建立表的語句檔案
- ibd:資料庫資料+索引檔案
INNODB查詢速度不快
比如以下圖。我們對id和username建立了索引
- 第一個IBD索引資料檔案記錄了id和資料
- 第二個IBD索引檔案,如果對username也建立了索引,則記錄的是username的索引和對應的id,為了節省空間,不儲存資料