結合索引的最左婚聊包養配準繩

作者:

分類:

華秋PCB

高靠得住多層板制造商

華秋SMT

高靠得住一站式PCBA智造商

華秋商城

自營現貨電子元器件商城

PCB Layout

高多層、高密度產物design

鋼網制造

專注高品德鋼網制造

BOM配單

專門研究的一站式采購處理計劃

華秋DFM

一鍵剖析design隱患

華秋認證

認證檢測無可置疑


結合索引的最左婚配準繩會一向向右婚配直到碰到范圍查詢(>、我在昨晚折騰了幾個試驗,發明這個結論并不全對!往失落 「between 和 like 」這個結論就沒題目了。

顛末試驗的證實,我得出的結論是如許的:

結合索引的最左婚配準繩,在碰到范圍查詢(如 >、=、這四種范圍查詢,并不會結束婚配。

接上去,我會用幾個試驗例子來闡明包養站長這個結論。

0e3c4b20-4a93-11ed-a3b6-dac502259ad0.png

B+Tree 索引

起首,先來熟悉下 B+Tree 索引。

MySQL 的 InnoDB 存儲引擎會為每一張數據庫表創立一個「聚簇索引」來保留表的數據,聚簇索引默許應用的是 B+Tree 索引。

為了讓大師包養dcard懂得 B+Tree 索引的存儲和查詢的經過歷程,接上去我經由過程一個簡略例子,闡明一下 B+Tree 索引在存儲數據中的詳細完成。

假定有一張商品表,表里有這些數據:

0e436be4-4a93-11ed-a3b6-dac502259ad0.png

這些數據,存儲在 B+Tree 索引時是長什么樣子的?

B+Tree 是一種多叉樹,葉子節點才寄存數據,非葉子節點只寄存索引,並且每個節點里的數據是按主鍵值(id)次序寄存的,每一層父節點的索引值城市呈現鄙人層子節點的索引值中,是以在葉子節點中,包含了一切的索引值信息,并且每一個葉子節點都指向下一個葉子節點,構成一個鏈表,便于范圍查詢。

聚簇索引的 B+Tree 如圖所示:

0e4e6530-4a93-11ed-a3b6-dac502259ad0.png

假定,履行了 select * from t_product where id = 5 查詢語句,該查詢語句的前提是找到 id(主鍵)為 5 的這筆記錄。由於 B+Tree 是一個有序的數據構造,所以可以經由過程二分查找算法疾速定位到這筆記錄,這也就是我們常說的索引查詢,詳細經過歷程如下:

從根節點開端,將 5 與根節點的索引數據 (1,10,20) 比擬,5 在 1 和 10 之間,依據二分查找算法,找到第二層的索包養app引數據 (1,4,7);

在第二層的索引數據 (1,4,7)中停止查找,由於 5 在 4 和 7 之間,依據二分查找算法,找到第三層的索引數據(4,5,6“小姐,你不知道嗎?”蔡修有些意外。);

在葉子節點的索引數據(4,5,6)中停止查找,然后我們找到了索引值為 5 的這筆記錄。

聚簇索引只能用于主鍵字段的疾速查詢,假如想完成「非主鍵字段」的疾速查詢,我們就要針對「非主鍵字段」創立索引,這種索引稱作為「二級索引」。二級索引異樣基于 B+Tree 完成的,不外二級索引的葉子節點寄存的是主鍵值,不是現實數據。

我這里將後面的商品表中的 product_no (商品編碼)字段設置為二級索引,那么二級索引的 B+Tree 如下圖,此中非葉子的索引值是 product_no(圖中橙色部門),葉子節點存儲的數據是主鍵值(圖中綠色部門)。

0e5b62f8-4a93-11ed-a3b6-dac502259ad0.png假如我用 product_no 二級索引查詢商品,如下查詢語句:

select*fromproductwhereproduct_no='0002';

會先在二級索引的 B+Tree 中疾速查找到 product_no 為 0002 的二級索引記載,然后獲取主鍵值,然后應用主鍵值在主鍵索引的 B+Tree 中疾速查詢到對應的葉子節點,然后獲取完全的記載。這個經過歷程叫「回表」,也就是說要查兩個 B+Tree 才幹查到數據。如下圖:

0e652b76-4a93-11ed-a3b6-dac502259ad0.png

不外,當查詢的數據是能在二級索引的 B+Tree 的葉子節點里查詢到,這時就不消再查主鍵索引查,好比上面這條查詢語句:

selectidfromproductwhereprodu包養留言板ct_no='0002';

這種在二級索引的 B+Tree 就能查詢到成果的經過歷程就叫作「籠罩索引」,也就是只需求查一個 B+Tree 就能找到數據。

什么是結合索引?

前文我將 product_no 字段設置為了索引,這種二級索引只要一個字段。假如將多個字段組分解一個索引,那么這種二級索引就被稱為結合索引。

好比,將商品表中的 product_no 和 name 字段組分解結合索引`(product_no, name)“包養情婦,創立結合索引的方包養妹法如下:

CREATEINDEXindex_product_no_nameONproduct(product_no,name);

結合索引 “(product_no, name)` 的 B+Tree 表示圖如下:

0e6a19c4-4a93-11ed-a3b6-dac502259ad0.png

可以看到,結合索引的非葉子節點用兩個字段的值作為 B+Tree 的索引值。

結合索引的 B+Tree 是先按 product_no 停止排序,然后再 product_no 雷同的情形再按 name 字段排序。記住這句話,很主要!

最左婚配準繩

應用結合索引時,存在最左婚配準繩,也就是依照最左優先的方法停止索引的婚配。

在應用結合索引停止查詢的時辰,假如不遵守「最左婚配準繩」,結合索引會掉效,如許就無法應用到索引疾速查詢的特徵了。

好比,假如創立了一個 (a, b, c) 結合索引,假如查詢前提是以下這幾種,就可以應用結合索引:短期包養

where a=1;

where a=1 and b=2 and c=3;

where a=1 and b=2;

需求留意的是,由於有查詢優化器,所以 a 字段在 where 子句的次序并不主要。可是,假如查詢前提是以下這幾種,由於不合適最左婚配準繩,所以就無法婚配上結合索引,結合索引就會掉效:

where b=2;

where c=3;

包養網車馬費where b=2 and c=3;

下面這些查詢前提之所以會掉效,是由於(a, b, c) 結合索引,是先按 a 排序,在 a 雷同的情形再按 b 排序,在 b 雷同的情形再按 c 排序。所以,b 和 c 是全局無序,部分絕對有序的,如許在沒有遵守最左婚配準繩的情形下,是無法應用到索引的。

我這里舉結合索引(a,b)的例子,該結合索引的 B+ Tree 如下:

0e8fb49a-4a93-11ed-a3b6-dac502259ad0.png

可以看到,a 是全局有序的(1, 2, 2, 3, 4, 5, 6, 7 ,8),而 b 是全局是無序的(12,7,8,2,3,8,10,5,2)。是以,直接履行 where b = 2 這種查詢前提沒有措施應用結合索引的,應用索引的條件是索引里的 key 是有序的。

只要在 a 雷同的情形才,b 才是有序的,好比 a 等于 2 的時辰,b 的值為(7,8),這時就是有序的,這個有序狀況是部分的,是以,履行 where a = 2 and b = 7 這種查詢前提時, a 和 b 字段能用到結合索引的,也就是結合索引失效了。

結合索引范圍查詢

結合索引有一些特別情形,并不是查詢經過歷程應用了結合索引查詢,就代表結合索引中的一切字段都用到了結合索引停止索引查詢,也就是能夠存在部門字段用到結合索引的 B+Tree,部門字段沒有效到結合索包養一個月價錢引的 B+Tree 的情形。

這種特別情形就產生在范圍查詢。也就是文章開首的那句話:結合索引的最左婚配準繩會一向向右婚配直到碰到「范圍查詢」就會結束婚配。也就是范圍查詢的字段可以用到結合索引,可是范圍查詢字段的后面的字段無法用到結合索引。

范圍查詢有良多種,那究竟是哪些范圍查詢會包養價格ptt招致結合索引的最左婚配準繩會結束婚配呢?

接上去,舉例幾個范圍查詢的例子,上面的試驗案例是基于 MySQL 8.0做的。

例子一

Q1: select * 想通了這件事後,她憤怒地叫了起來。當場睡著了,直到不久前才醒來。from t_table where a > 1 and b = 2,結合索引(a, b)哪一個字段用到了結合索引的 B+Tree?

由于結合索引(二級索引)是先依照 a 字段的值排序的,所以合適 a > 1 前提包養金額的二級索引記載確定是相鄰的,于是在停止索引掃描的時辰,可以定位到合適 a > 1 前提的第一筆記錄,然后沿著記載地點的鏈表向后掃描,直到某筆記錄不合適 a > 1 前提地位。所以 a 字段可以在結合索引的 B+Tree 中停止索引查詢。

可是在合適 a > 1 前提的二級索引記載的范圍里,b 字段的值是無序的。

好比,下圖的結合索引的 B+ Tree 里:

0e8fb49a-4a93-11ed-a3b6-dac502259ad0.png

上面這三筆記錄的 a 字段的值都合適 a > 1 查詢前提,而 b 字段的值是無序的:

a包養dcard 字段值為 5 的記載,該記載的 b 字段值為 8;

a 字段值為 6 的記載包養違法,該記載的 b 字段值為 10;

a 字段值為 7 的記載,該記載的 b 字段值為 5;

是以,我們不克不及依據查詢前提 b = 2 來進一個步驟削減需求掃描的記載多少數字(b 字段無法應用結合索引停止索引查詢的意思)。

所以在履行 Q1 這條查詢語句的時辰,對應的掃描區間是 (2, + ∞),構成該掃描區間的鴻溝前提是 a > 1,與 b = 2 有關。

是以,Q1 這條查詢語句只要包養條件 a 字段用到了結合索引停止索引查詢,而 b 字段并沒有應用到結合索引。

我們也可以在履行打算中的 key_len 了解這一點,在應用結合索引停止查詢的時辰,經由過程 key_len 我們可以了解優化用具體應用了幾多個字段的查詢前提來構成掃描區間的鴻溝前提。

舉例個例子 ,a 和 b 都是 int 類型且不為 NULL 的字段,那么 Q1 這條查詢語句履行打算如下:

0ec650ea-4a93-11ed-a3b6-dac502259ad0.png

可以看到 key_len 為 4 字節(假如字段答應為 NULL,就在字段類型占用的字節數上加 1,也就是 5 字節),闡明只要 a 字段用到了結合索引停止索引查詢,並且可以看到,即便 b 字段沒用到結合索引,key 為 idx_a_b,闡明 Q1 查詢語句應用了 idx_a_b 結合索引。

經由過程 Q1 查詢語句我們可以了解甜心花園,a 字段應用了 > 停止范圍查詢,結合索引的最左婚配準繩在碰到 a 字段的范圍查詢( 媳婦了。我們家是小戶型,有沒有大規矩要學,所以你可以放鬆,不要太緊張。”>)后就結束婚配了,是以 b 字段并沒有應用到結合索引。

例子二

Q2: select * from t_table where a >= 1 and b = 2,結合索引(a,包養俱樂部 b)哪一個字段用到了結合索引的 B+Tree?

Q2 和 Q1 的查詢語句很像,獨一的差別就是 a 字段的查詢前提「年夜于等于」。

由于結合索引(二級索引)是先依照 a 字段的值排序的,所以合適 >= 1 前提的二級索引記載確定是相鄰,于短期包養是在停止索引掃描的時辰,可以定位到合適 >= 1 前提的第一筆記錄,然后沿著記載地點的鏈表向后掃描包養平台,直到某筆記錄不合適 a>= 1 前提地位。所以 a 字段可以在結合索引的 B+Tree 中停止索引查詢。

固然在合適 a>= 1 前提的二級索引記載的范圍里,b 字段的值是「無序」的,可是對于合適 a = 1 的二級索引記載的范圍里,b包養心得 字段的值是「有序」的(由於對于結合索引,是先依照 a 字段的值排序,然后在 a 字段的值雷同的情形下,再依照 b 字段的值停止排序)。

于是,在斷定需求掃描的二級索引的范圍時,當二級索引記載的 a 字段值為 1 時,可以經由過程 b = 2 前提削減需求掃描的二級索引記載范圍(b 字段可以應用結合索引停止索引查詢的意思)。也就是說,從合適 a = 1 and b = 2 前提的第一筆記錄開端掃描,而不需求從第一個 a 字段值為 1 的記載開端掃描。

所以,Q2 這條查詢語句 a 和 b 字段都用到了結合索引停止索引查詢。

我們也可以在履行打算中的 key_len 了解這一點。履行打算如下:

0ed35a60-4a93-11ed-a3b6-dac502259ad0.png

可以看到 key_len 為 8 字節,闡明優化器應用了 2 個字段的查詢前提來構成掃描區間的鴻溝前提,也就是 a 和 b 字段都用到了結合索引停止索引查詢。

經由過程 Q2 查詢語句我們可以了解,固然 a 字段應用了 >= 停止范圍查詢,可是結合索引的最左婚配準繩并沒有在碰到 a 字段的范圍查詢( >=)后就結束婚配了,b 字段仍是可以用到了結合索引的。

例子三

Q3: SELECT * FROM t_table WHERE a BETWEEN 2 AND 8 AND b = 2,結合索引(a, b)哪一個字段用到了結合索引的 B+Tree?

Q3 查詢前提中 a BETWEEN 2 AND 8 的意思是查詢 a 字段的值在 2 和 8 之間的記載。

分歧的數據庫對 BETWEEN … AND 處置方法是有差別的。在 MySQL 中,BETWEEN 包括了 value1 和 value2 鴻溝值,相似于 >= and = and Q3 這條查詢語句 a 和 b 字段包養甜心網都用到了結合索引停止索引查詢。

我們也可以在履行打算中的 key_len 了解這一點。履行打算如下:

0efe49fa-4a93-11ed-a3b6-dac502259ad0.png

可以看到 key_len 為 8 字節,闡明優化器應用了 2 個字段的查詢前提來構成掃描區間的鴻溝前提,也就是 a 和 b 字段都用到了結合索引停止索引查詢。

經由過程 Q3 查詢語句我們可以了解,固然 a 字段應用了 BETWEEN 停止范圍查詢,可是結合索引的最左婚配準繩并沒有在碰到 a 字段的范圍查詢( BETWEEN)后就結束婚配了,b 字段仍是可以用到了結合索引的。

例子四

Q4: SELECT * FROM t_user WHERE name like ‘j%’ and age = 22,結合索引(name, age)哪一個字段用到了結合索引的 B+Tree?

由于結合索引(二級索引)是先依照 name 字段的值排序的,所以前綴為 ‘j’ 的 name 字段的二級索引記載都是相鄰的, 于是在停止索引掃描的時辰,可以定位到合適前綴為 ‘j’ 的 name 字段的第一筆記錄,然后沿著記載地點的鏈表向后掃描,直到某筆記錄的 name 前綴不為 ‘j’ 為止。

所以 a 字段可以在結合索引的 B+Tree 中停止索引查詢,構成的掃描區間是[‘j’,’k’包養妹)。留意, j 是閉區間。如下圖:

0f271178-4a93-11ed-a3b6-dac502259ad0.png

固然在合適前綴為 ‘j’ 的 包養網推薦name 字段的二級索引記載的范圍里,age 字段的值是「無序」的,可是對于合適 name = j 的二級索引記載的范圍里,age字段的值是「有序」的(由於對于結合索引,是先依照 name 字段的值排序,然后在 name 字段的值雷同的情形下,再依照 age 字段的值停止排序)。

于是,在斷定需求掃描的二級索引的范圍時,當二級索引記載的 name 字段值為 ‘j’ 時,可以經由過程 age = 22 前提削減需求掃描的二級索引記載范圍(age 字段可以應用結合索引停止索引查詢的意思)。也就是說,從合適 name = ‘j’ and age = 22 前提的第一筆記錄時開端掃描,而不需求從第一個 name 為 j 的記載開端掃描 。如下圖的左邊:

0f2f6e7c-4a93-11ed-a3b6-dac502259ad0.png

所以,Q4 這條查詢語句 a 和 b 字段都用到了結合索引停止索引查詢。

我們也可以在履行打算中的 key_len 了解這一點。本次例子中:

name 字段的類型是 varchar(30) 且不為 NULL,數據庫表應用了 utf8mb4 字符集,一個字符集為 utf8mb4 的字符是 4 個字節,是以 name 字段的現實數據最多占用的存儲空間長度是 120 字節(30 x 4),包養價格ptt然后由於 name 是變長類型的字段,需求再加 2,也就是 name 的 key_len 為 122。

age 字段的類型是 int 且不為 NULL,key_len 為 4。

Q4 查詢語句的履行打算如下:

0f351f34-4a93-11ed-a3b6-dac502259ad0.png

可以看到 key_len 為 126 字節,name 的 key_len 為 122,age 的 key_len 為 4,闡明優化器應用了 2 個字段的查詢前提來構成掃描區間的鴻溝前提,也包養ptt就是 name 和 age 字段都用到了結合索引停止索引查詢。

經由過程 Q4 查詢語句我們可以了解,固然 name 字段應用了 like 前綴婚配停止范圍查詢,可包養網推薦是結合索引的最左婚配準繩并沒有在碰到 name 字段的范圍查詢( like ‘j%’)后就結長期包養束婚配了,age 字段仍是可以用到了結合索引的。

小結

網上傳來穿往這句話:「結合索引的最左婚配準繩會一向向右婚配直到碰到范圍查詢(>、結合索引的最左婚配準繩,在碰到范圍查詢(如 >、=、

審核編纂:劉清


原文題目:全網都在說一個過錯的結論

文章出處:【微電子訊號:小林coding,微信大眾號:小林coding】接待添加追蹤關心!文章轉錄發載請注明出處。


基于網格索引的高速收集數據流偏好查詢方式 摘 要:為增年夜高速收集中被叫醒信息節點的多少數字值程度,使得收集主性能夠正確把握數據流偏好,從而完成對收集數據的精準查詢,提出基于網格索引的高速收集數據流偏好查詢方式。依據網格索引準繩,樹立完全的空間 頒發于 11-03 16:32 •576次瀏覽台灣包養
基于增量序列的調色板索引婚配算法 基于增量序列的調色板索引婚配算法天生帶調色板的圖像文件時,需求處理調色板索引婚配的題目。針對該題目,本文提出了一種增量序列的發生方式,并基于這種序列,給出了一種調色板 頒發于 09-19 09:34
Mysql優化選擇最佳索引規定 每個表添加一個列的列表。2. 在任何索引中最右邊的列應與查詢相等比擬婚配,可以添加多個列,只需一切列與常量停止比擬相等即可。3.選擇一個列,這將是范圍列,MySQL 在每個索引中只支撐 頒發于 07-06 15:13
誰能具體先容一下mysql索引嗎? 索引的基礎號令履行打算剖析索引利用規范結合索引的key_len盤算方法 頒發于 11-10 06:27
光電檢測體系design的基礎準繩 九個基礎準繩:1.婚配準繩(光電婚配、精度婚配)見P122.阿貝比擬準繩3.活動學 頒發于 07-04 12:58 •27次下載
功放和喇叭若何婚配_功放與喇叭的婚配準繩是什么 本文開端先容了功放的概念和主要參數,其次論述了各類功放的效能及感化,最后先容了功放和喇叭的婚配方法與婚配準繩。 頒發于 04-12 17:25 •14.7w次瀏覽
MySQL索引應用準繩 普通來說, MySQL 中的 B-Tree 索引的物理文件年夜多都是以 Balance Tree 的構造來存儲的,也就是一切現實需求的數據都寄存于 Tree 的 Leaf Node(葉子節點) ,並且 的頭像 頒發于 02-11 15:17 •2643次瀏覽
MySQL索引的應用題目 一、媒介 在MySQL中停止S藍玉華聞言,聽到蔡修的提議,心中暗喜。娘聽了她片面的言論後,真的不敢相信一切,把誠實不會撒謊的彩衣帶回來,真的QL優化的時辰,常常會在一些情形下,對MySQL可否應用索引有一些困惑。譬如:她在陽光下的美貌,著實讓他吃驚和驚嘆,但奇怪的是,他以前沒有見過她,但當時的感覺和現在的感覺,真的不一樣了。1、MySQL 在碰到范圍查詢前提的時辰就結束婚配了,那么究竟是哪些范圍前提?2 的頭像 頒發于 01-06 16:13 •1518次瀏覽
一百道關于MySQL索引解答 是字符串,where時必定用引號括起來,不然索引掉效 like通配符能夠招致索引掉效。 結合索引,查sd包養詢時的前提列不是結合 的頭像 頒發于 06-13 15:51 •1996次瀏覽
sql優化常用的幾種方式 1包養心得.5 斷定題目并采用響應的辦法 2. 慢查詢經典案例剖析 2.1 案例1:隱式轉換 2.2 案例2:最左婚配 2.3 案例3:深分頁題目 2.4  案例4:in元素過多 2.5 order by 走 的頭像 頒發于 11-14 15:04 •2229次瀏覽
索引的底層完成詳解 說一說索引的底層完成? Hash索引 基于包養金額哈希表完成,只要準確婚配索引一切列的查詢才有用,對于每一行數據,存儲引擎城市對一切的索引列盤算一個 的頭像女大生包養俱樂部 頒發于 10-09 10:26 •622次瀏覽
低噪聲縮小器輸出端和輸入端婚配準繩是什么?阻抗婚配的目標是什么? 低噪聲縮小器輸出端和輸入端婚配準繩是什么?阻抗婚配的目標是什么? 低噪聲縮小器輸出端和輸入端婚配準繩是什么? 低噪聲縮小器是電路體系中的一個 的頭像 頒發于 10-20 14:55 •1611次瀏覽


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *