1. 程式人生 > 實用技巧 >資料庫索引原理

資料庫索引原理

目錄


筆記來源:原始碼學院

索引(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,為了節省空間,不儲存資料