mysql索引 2 索引內部結構

2021-10-02 01:29:32 字數 1423 閱讀 3466

主要說明btree和hash索引

1.常用的加快查詢速度的資料結構

樹:

二叉查詢樹:查詢/插入/修改/刪除的平均時間複雜度都是o(n)

平衡二叉樹:查詢/插入/修改/刪除的平均時間複雜度都是o(logn)

紅黑樹:查詢/插入/修改/刪除的平均時間複雜度都是o(logn)

雜湊: hashmap:查詢/插入/修改/刪除的平均時間複雜度都是o(1)

hashset:查詢/插入/修改/刪除的平均時間複雜度都是o(1)

總結: 如果是對單行的資料進行查詢,很明顯雜湊索引很快,但是由於mysql不能確定兩個值之間會存在多少行的資料,這時使用雜湊索引,它的時間複雜度會退化為o(n),而樹型的索引的時間複雜度仍然是o(logn)

2.btree索引與hash索引

myisam 和 innodb 儲存引擎的表預設建立的都是 btree 索引

(1).hash索引

~ 只用於使用=或<=>操作符的等式比較。

~ 優化器不能使用 hash 索引來加速 order by 操作。

~ 只能使用整個關鍵字來搜尋一行。

~ 由於mysql不能確定兩個值之間會存在多少行的資料,資料多時使用樹型索引

(3)btree索引

(1)b樹

~ 由於b樹不同於二叉樹的二叉搜尋,b樹可以進行m叉搜尋

~ b樹的非葉子節點和葉子節點都可以儲存資料,優於二叉樹的每個節點儲存的是記錄

~ b樹可以通過中序遍歷獲得所有的節點

(2)b+樹

~ 在b樹的基礎上進行了改進,仍然是m叉搜尋樹

~ b+樹非葉子節點不在儲存資料,而是將資料儲存在同一層的葉子節點上。(b+樹中根到每乙個節點的路徑長度一樣)

~ 葉子之間,增加了鍊錶,獲取所有節點,不再需要中序遍歷

3.b樹索引和b+樹索引比較

(1)b樹適合做索引的原因

~ b樹充分的利用到了磁碟預讀(不是按需讀取,按頁讀取,一次讀一頁(4k),如果之後讀取的資料存在預讀的資料中,那麼就可以很好的提高i/o效率)--依據區域性性原理

~ 由於b樹是m分叉的,所以樹的高度能夠降低很多;

~ 每個節點可以儲存n個記錄,如果將節點大小設定為頁大小,可以利用磁碟預讀,極大減少磁碟io;

(2)b+樹比b樹更適合做為索引的原因

b樹:有序陣列+平衡多叉樹,b+樹:有序陣列鍊錶+平衡多叉樹;

範圍查詢:定位min與max之後,中間葉子節點,就是結果集,不用中序回溯;

葉子節點儲存實際的資料記錄,適合資料量大的磁碟儲存,非葉子節點存放是記錄的key,可以存放更多的索引

總結:b+樹的查詢效率更高效

b+樹的磁碟讀寫代價更低

b+樹空間利用率更高,可減少i/o次數

Mysql 內部結構(簡)

記憶體結構包括buffer pool,change buffer,adaptive hash index和log buffer四塊。緩衝池,bp內部以page為單位,預設為16k,bp底層採用鍊錶管理page,innodb訪問表記錄和索引時會在page中快取,後續先快取,未命中再io。page分為f...

HBase內部結構

table表 就是有乙個或者多個列族組成,加上之前的 使用,這個表概念應該很熟了 row行 乙個行包括了多個列,這些列通過列族來分類 column family列族 列族是多個列的集合,hbase會盡量的將乙個列族的列放入同乙個伺服器內,這樣可以提高訪問效能,並且可以批量管理有關聯的一堆列,所有的資...

mysql not 索引 MySQL 索引結構

為資料表增加索引 index 可以提公升mysql資料查詢效率。mysql中所有型別的資料字段都可以有索引。索引指向了資料表中的記錄 行 可以快速判斷某行記錄是否符合 where 語句中的限定條件。但是索引並不是越多越好 索引需要耗費儲存空間 索引越多,mysql在決定採用哪個索引時也會消耗更多時間...