Mysql底層索引詳解

2021-09-27 19:13:10 字數 2046 閱讀 8505

索引本質以及索引型別:

mysql底層索引的資料結構是b+tree(b-tree變種)

非葉子節點不儲存data,只儲存索引,可以放更多的索引;

順序訪問指標,提高區間訪問的效能。

b+tree樹節點的大小為16kb,每個樹的的結點會被load到記憶體,每次和磁碟進行一次io操作(比較耗時)。

乙個索引的記憶體大小為8b,指標的記憶體大小為6b,所以乙個索引的實際大小為14b(位元組)。

16kb / 14b 約等於1170,所以乙個b+tree樹節點可以存放1170個索引。那麼第二層的索引個數大約為1170 * 1170個。

毛估第三層乙個索引+對應的資料的大小為1kb,那麼第三層乙個葉子節點可以包含16kb / 1kb = 16個索引。那麼這樣下來**b+tree的三層可以存放1170 x 1170 x 16 = 2千多萬個索引。**

1,為什麼不使用hash作為索引方法?

答:不支撐範圍查詢。select * from student where id > 10;

b+tree可以支撐範圍查詢,因為他有乙個指標指向下乙個索引。如圖:

mysql表的儲存引擎為myisam:

frm檔案存放表結構;

myd檔案存放表中的資料;

myi檔案存放表的索引。

myisam儲存引擎的查詢過程:

1,將b+tree的索引節點load到記憶體,進行比較,依次往樹的下面尋找;

2,最後在樹的葉子節點找到與之對應的索引值,而索引的data存放的是:索引所在資料行的磁碟檔案指標(如上圖:ox90);

3,根據該指標,把資料從資料表中查詢出來即可。

該過程查詢了2個檔案,乙個myi檔案,乙個myd檔案;相比innodb多了乙個磁碟io。

mysql表的儲存引擎為innodb:

1,frm檔案存放表結構;

2,ibd檔案存放索引和資料。

innodb儲存引擎的查詢過程:

1,將b+tree的索引節點load到記憶體,進行比較,依次往樹的下面尋找;

2,最後在樹的葉子節點找到與之對應的索引值,而索引的data存放的是:索引對應行的資料;

該過程只查詢了1個檔案,ibd檔案,相比myisam儲存引擎少了一次磁碟io。

1,什麼是聚集索引?

2,innodb表必須有主鍵,並且推薦使用整型的自增主鍵?

先根據name找到id,然後根據id找到對應的資料

b樹和b+樹的區別:b樹和b+樹的區別,聚集索引和非聚集索引的區別

mysql底層 索引

mysql只是乙個應用軟體,不能直接讀取磁碟上的資料,當我們需要讀取某條資料的時候,mysql呼叫核心的乙個函式,告訴核心我要讀取某個資料,核心驅動磁柱磁頭去讀取資料,讀取資料之後怎麼返回裡,其實是把資料寫到記憶體中了 這個記憶體只是核心記憶體,並不是mysql記憶體 接下來再把資料copy到mys...

mysql索引底層

資料結構 二叉樹 從父節點開始,大的往右,小的往左,當有序的增長就變成了單邊增長,就會對效能沒什麼提公升,不適合 紅黑樹 二叉樹的平衡版,通過自旋等方式實現平衡 當資料很多時,紅黑樹的高度就變得很高,查詢一次需要多次的io不適合大資料查詢 b樹和b 樹 乙個節點都可以存多個元素 多叉樹 以有序的方式...

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...