為什麼mysql索引要用B Tree資料結構

2021-10-03 14:15:19 字數 1488 閱讀 1722

二叉樹

不適合自增長索引,失去索引效率,樹單邊增長,成煉錶狀。

(從1插入到4)

紅黑樹(平衡二叉樹)

不適合資料量大,樹太高。如果查詢資料在葉子節點,則需要查樹高次數。

(從1插入到5)

hash表

hash衝突,並且不支援範圍查詢,大於小於區間查詢。

mysql支援,等於查詢能快速定位,只適合資料量特別大,範圍查詢很少,效能要求很高場景。

b+tree

data放在葉子節點, 非葉子節點不存data,只存索引,可以放更多的索引,順時針訪問指標,提高了區間訪問效能。

支援範圍查詢,左節點比父節點小,右節點比父節點大,並且葉子節點有雙向位址指標定位。

非葉子節點帶data,增加了每次io的記憶體占用。

沒有b+tree葉子節點的指標,不方便範圍查詢。

注:1.樹結構預設左節點小於父節點,右節點大於父節點。

2.mysql庫中表沒有建主鍵索引會預設自己找乙個唯一欄位建索引,如果沒有會新建乙個字段維護乙個索引結構在後台。

所以建表時應建主鍵索引,而建立自增的主鍵索引可以減少葉子節點的變動,有利於索引維護。

主鍵索引(唯一 非空)

普通索引  ()

唯一索引 (唯一 可有一空)

全文索引  

組合索引  (兩個或者多個字段索引)

當為普通索引時,先查普通索引找到主鍵,然後再根據主鍵查整行資料(回表)

select * from member where name = 'lili'     (回表)

select id from member where name ='lili'    不用回表直接取出

當為組合索引時,滿足最左匹配原則 ,即組合索引左邊的要先滿足,才能滿足右邊索引。

(name ,age)

select  * from member where name ='lili'  and age =1      (滿足)

select  * from member where name ='lili'    (滿足)

select  * from member where age =1      (不滿足)

select  * from member where age =1 and name ='lili'    (優化器把條件調換位置  ,滿足)

mysql全文索引一般不用,一般會用es等進行全文索引。

為什麼MySQL要用B Tree來做索引

1.2 為什麼作業系統操作磁碟的最小單位是簇 1.3 尋道時間 1.4 讀取乙個簇的時間 ta 1.5 磁碟讀取時間總結 2.資料庫儲存 資料結構選擇 2.2 有序資料結構 2.2.2 btree 2.2.3 b tree 3.總結 紅黑樹資料結構 btree資料結構 b tree資料結構 建議稍微...

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

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

為什麼要用 enable shared from

樓主 hma if you think you can,you can.panrainbow 憂鬱淡藍 於 tue nov 9 11 48 38 2010 提到 引入enable shared from this的原因是可以實現返回值為指向該類本身的 shared ptr,為什麼以this為拷貝構造...