Mysql使用索引為什麼會變快?

2021-10-04 16:32:32 字數 913 閱讀 3949

mysql 使用的是 btree 索引,那它是怎麼加速檢索的呢?

檢索中主要耗時在於記憶體與磁碟的io耗時,所以加速的關鍵在於減少io的次數。

圖中是一顆 b 樹,每個磁碟塊包含幾個資料項和指標,

如磁碟塊 1 包含資料項 17 和 35,包含指標 p1、p2、p3,

p1指向包含資料項小於17的磁碟塊,p2指向資料項在17和35之間的磁碟塊,p3 指向資料項大於35的磁碟塊。

真實的資料存在於葉子節點,即 3、5、9、10、13、15、28、29、36、60、75、79、90、99。

非葉子節點只不儲存真實的資料,只儲存指引搜尋方向的資料項,如 17、35 並不真實存在於資料表中。

【查詢過程】 以查詢資料項29為例

首先會把磁碟塊 1 由磁碟載入到記憶體,此時發生一次 io,在記憶體中用二分查詢確定29在17和35之間,鎖定磁碟塊1的 p2指標,相比磁碟的 io,記憶體時間非常短可以忽略不計。

通過磁碟塊 1的 p2 指標的磁碟位址把磁碟塊 3 由磁碟載入到記憶體,發生第二次 io,29 在 26 和 30 之間,同理鎖定磁碟塊 3 的 p2 指標。

通過指標載入磁碟塊 8 到記憶體,發生第三次 io,同時記憶體中做二分查詢找到了資料項 29,結束查詢,總計三次 io。

真實的情況中,3 層的樹可以表示上百萬的資料,上百萬的資料查詢只需要三次 io,效能提高是巨大的,速度自然很快。相反如果沒有索引,那就要遍歷所有資料,最差情況下每個資料項都要發生一次 io,那麼總共需要百萬次的 io,速度自然很慢。

我們為什麼要用索引,用索引為什麼比不用索引快

經過老楊的細心指點,我才真正的明白 理解 記住 以前曾看過索引的資料,時間長都忘啦 老楊問我如果一張表上沒有索引,你要查id 5的記錄,資料庫會怎麼做?我說資料庫會先根據資料字典找到這張表,然後根據表頭的記錄找到這張表的資料塊,然後每個資料塊去找。老楊 會把所有的資料塊都掃一遍嗎?我 有可能會,有可...

資料庫索引為什麼使用B 樹?

b tree 二叉樹 binary tree 每個節點只能儲存乙個數。b tree b樹 b tree,並不是b 減 樹,橫槓為連線符,容易被誤導 b樹屬於多叉樹又名平衡多路查詢樹。每個節點可以多個數 由磁碟大小決定 b tree和b tree都是 b tree的變種 一般來說,索引本身也很大,不可...

資料庫索引為什麼使用B 樹

首先,紅黑樹乙個節點存乙個索引,雖然能提公升查詢的效率,但是o log2 n 的優化有限,對於大量資料而言,樹高決定了io的次數還是比較多 b 樹相比b樹,非葉子節點只存索引和下一節點指標,而少了關鍵字具體資訊的指標,所以節點比較小。在一次io操作下,讀取到的資料塊中,索引key更多,相對來說,進行...