mysql索引的實現原理

2021-08-03 12:56:35 字數 1327 閱讀 6805

索引是一種為了幫助資料庫系統高效獲取資料而由其維護著的滿足特定查詢演算法的資料結構

節點的度:乙個節點含有的子樹的個數稱為該節點的度;

樹的度:一棵樹中,最大的節點的度稱為樹的度;

葉節點或終端節點:度為零的節點;

非終端節點或分支節點:度不為零的節點;

首先從根節點進行二分查詢,如果找到則返回對應節點的data,否則對相應區間的指標指向的節點遞迴進行查詢,直到找到節點或找到null指標,前者查詢成功,後者查詢失敗.

b-tree上查詢演算法的偽**如下:

btree_search(node, key) 

return btree_search(point[i+1]->node);

}data = btree_search(root, my_key);

性質:度為d 索引為n個 則其樹高h的上限為 lo

gd((

n+1)

/2) 。 檢索乙個key,其查詢節點個數的漸進複雜度為 o(

logdn)

插入刪除新的資料記錄會破壞b-tree的性質,因此在插入刪除時,需要對樹進行乙個**、合併、轉移等操作以保持b-tree性質。

mysql一般採用b+tree

與b-tree相比,b+tree有以下不同點:

每個節點的指標上限為2d而不是2d+1。

內節點不儲存data,只儲存key;葉子節點不儲存指標。

在b+tree的每個葉子節點增加乙個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的b+tree。

葉節點的data域存放的是資料記錄的位址,內節點的作用是導航。

效率問題。

如果要查詢key為從18到49的所有資料記錄,當找到18後,只需順著節點和指標順序遍歷就可以一次性訪問到所有資料節點,極大提到了區間查詢效率。

逐漸的問題:

如果沒有顯式指定,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵。

最左字首原理:

mysql的查詢優化器會自動調整where子句的條件順序以使用適合的索引。

如果萬用字元%不出現在開頭,則可以用到索引。

between實際上相當於in

表記錄比較少(2000以下)

選擇性越高的索引價值越大,這是由b+tree的性質決定的

select

count(distinct(title))/count(*) as selectivity from employees.titles;

復合索引的選擇性(concat)

參考文章:

1.

mysql索引 mysql索引實現原理

什麼是索引 索引是一種高效獲取資料的儲存結構,例 hash 二叉 紅黑。mysql為什麼不用上面三種資料結構而採用b tree 若僅僅是 select from table where id 45 上面三種演算法可以輕易實現,但若是select from table where id 6 就不好使了...

Mysql索引的實現原理

在mysql中,索引屬於儲存引擎級別的概念,不同儲存引擎對索引的實現方式是不同的,本文主要討論myisam和innodb兩個儲存引擎的索引實現方式。這裡設表一共有三列,假設我們以col1為主鍵,則圖8是乙個myisam表的主索引 primary key 示意。可以看出myisam的索引檔案僅僅儲存資...

mysql索引實現原理

1.myisam引擎 非聚集索引 innodb引擎 聚集索引 索引是一種高效獲取資料的儲存結構,例 hash 二叉 紅黑。mysql為什麼不用上面三種資料結構而採用b tree 若僅僅是 select from user where id 100 上面三種演算法可以輕易實現,但若是select fr...