二叉樹
不適合自增長索引,失去索引效率,樹單邊增長,成煉錶狀。
(從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為拷貝構造...