B 樹與據庫的聯合索引

2021-09-29 00:09:59 字數 1317 閱讀 7421

先給乙個問題:

資料庫表t有a,b,c三個字段,對其建立聯合索引uniq(a,b,c),請問如下查詢哪些會用到索引?

1. select * from t where a=a and b=b and c=c;

2. select * from t where a=a and b=b;

3. select * from t where a=a and c=c;

4. select * from t where b=b and c=c;

大家都知道聯合索引有最左原則。也就是說,如果聯合索引的第乙個列沒有在where語句中,或者所查詢的列其中並沒有在索引中被建立。那麼,這個聯合索引是無效的。

比如,上面的問題,這個索引可以被用於搜尋如下所示的資料列組合:

a,b,c

a,ba

mysql不能利用這個索引來搜尋沒有包含在最左字首的內容。例如,如果你按照b或c來搜尋,就不會使用到這個索引。

如果你搜尋給定的a和c的組合,該索引也是不能用於這種組合值的,儘管mysql可以利用索引來查詢匹配的a從而縮小搜尋的範圍。

那麼,為什麼是最左原則呢?

就要想想聯合查詢的結構是怎樣的。

首先,先看看b+樹的結構圖。

(圖源張洋的《mysql索引背後的資料結構及演算法原理》一文)

那聯合索引呢?

這是一張**,col1 是主建,col2和col3 是普通字段。

(圖源張洋的《mysql索引背後的資料結構及演算法原理》一文)

那麼,多列的索引是這樣的

(圖源張洋的《mysql索引背後的資料結構及演算法原理》一文)

也就是說,聯合索引(col1, col2, col3)也是一棵b+樹,其非葉子節點儲存的是第乙個關鍵字的索引,而葉子節點儲存的則是三個關鍵字col1、col2、col3三個關鍵字的資料,且按照col1-col2-col3的順序進行排序。

索引還可以這麼畫。

如果執行的是,select * from t where b=『tom』 and c=4567;

那麼無法使用索引,因為索引是用a欄位先排序的,如果沒有先確定a,直接查詢b和c,那麼將會是全表查詢。

如果執行的是,select * from t where a=『30』 and b=demi;

那麼,會先找到a欄位,再在a等於30的資料中(比如有很多條),找b等於demi的資料。這樣是可以用到索引的。

如果執行的是,select * from t where a=『18』 and c=1234;

那麼,a欄位可以索引,而c不能索引。所以可以部分索引,也比全表查詢快。

現在,大概了解了什麼為什麼是最左原則。因為,b+樹是按照最左邊的字段以此構建的。

聯合索引 輔助索引 在B 樹的結構

在什麼是索引這篇文章中介紹了索引的常見的資料結構,其對應資料結構的圖是以主鍵索引來講解的。本文我們一起看下聯合使用在b 樹的結構是怎麼樣的?對多個字段同時建立的索引 有順序,abc,cba是完全不同的兩種聯合索引 假設聯合索引為age,name,school組合的 其在b 樹的結構如下 聯合索引的葉...

B樹與B 樹索引

b 樹 資料庫結構使用樹的結構索引,從演算法邏輯上看,二叉查詢樹的查詢速度和比較次數都是最小的。資料庫的索引儲存在磁碟上,當資料量比較大的時候,索引的大小可能有幾個g 甚至更多。當我們利用索引查詢的時候,不可能把整個索引載入到記憶體,能做的只有逐一載入每乙個磁碟頁,磁碟頁對應索引樹的節點。當利用二叉...

MySQL索引之B 樹與B 樹

本文只是個人閱讀筆記,原文建議詳細閱讀 什麼是b 樹 什麼是b 樹 我們知道mysql中索引最常用的資料結構就是hash和b tree,而其中的b 樹更是大多數 mysql 儲存引擎的預設索引型別。1 雜湊表 二叉查詢樹 b樹的比較要弄清楚b 樹,就得先知道b 樹 b 樹就是b樹 首先mysql索引...