国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
10 分鐘讓你明白 MySQL 是如何利用索引的?

一、前言

在 MySQL 中進(jìn)行 SQL 優(yōu)化的時(shí)候,經(jīng)常會(huì)在一些情況下,對(duì) MySQL 能否利用索引有一些迷惑。

譬如:

MySQL 在遇到范圍查詢條件的時(shí)候就停止匹配了,那么到底是哪些范圍條件?

MySQL 在 LIKE 進(jìn)行模糊匹配的時(shí)候又是如何利用索引的呢?

MySQL 到底在怎么樣的情況下能夠利用索引進(jìn)行排序?

今天,我將會(huì)用一個(gè)模型,把這些問題都一一解答,讓你對(duì) MySQL 索引的使用不再畏懼

二、知識(shí)補(bǔ)充

key_len

EXPLAIN 執(zhí)行計(jì)劃中有一列 key_len 用于表示本次查詢中,所選擇的索引長(zhǎng)度有多少字節(jié),通常我們可借此判斷聯(lián)合索引有多少列被選擇了。

在這里 key_len 大小的計(jì)算規(guī)則是:

一般地,key_len 等于索引列類型字節(jié)長(zhǎng)度,例如 int 類型為 4 bytes,bigint 為 8 bytes;

如果是字符串類型,還需要同時(shí)考慮字符集因素,例如:CHAR(30) UTF8 則 key_len 至少是 90 bytes;

若該列類型定義時(shí)允許 NULL,其 key_len 還需要再加 1 bytes;

若該列類型為變長(zhǎng)類型,例如 VARCHAR(TEXT\BLOB 不允許整列創(chuàng)建索引,如果創(chuàng)建部分索引也被視為動(dòng)態(tài)列類型),其 key_len 還需要再加 2 bytes;

三、哪些條件能用到索引

首先非常感謝登博,給了我一個(gè)很好的啟發(fā),我通過 * 他的文章 *,然后結(jié)合自己的理解,制作出了這幅圖

乍一看,是不是很暈,不急,我們慢慢來(lái)看

圖中一共分了三個(gè)部分:

Index Key :MySQL 是用來(lái)確定掃描的數(shù)據(jù)范圍,實(shí)際就是可以利用到的 MySQL 索引部分,體現(xiàn)在 Key Length。

Index Filter:MySQL 用來(lái)確定哪些數(shù)據(jù)是可以用索引去過濾,在啟用 ICP 后,可以用上索引的部分。

Table Filter:MySQL 無(wú)法用索引過濾,回表取回行數(shù)據(jù)后,到 server 層進(jìn)行數(shù)據(jù)過濾。

我們細(xì)細(xì)展開。

Index Key

Index Key 是用來(lái)確定 MySQL 的一個(gè)掃描范圍,分為上邊界和下邊界。

MySQL 利用 =、>=、> 來(lái)確定下邊界(first key),利用最左原則,首先判斷第一個(gè)索引鍵值在 where 條件中是否存在,如果存在,則判斷比較符號(hào),如果為 (=,>=) 中的一種,加入下邊界的界定,然后繼續(xù)判斷下一個(gè)索引鍵,如果存在且是(>),則將該鍵值加入到下邊界的界定,停止匹配下一個(gè)索引鍵;如果不存在,直接停止下邊界匹配。

exp:idx_c1_c2_c3(c1,c2,c3)where c1>=1 and c2>2 and c3=1--> first key (c1,c2)--> c1 為 '>=' ,加入下邊界界定,繼續(xù)匹配下一個(gè) -->c2 為 '>',加入下邊界界定,停止匹配

上邊界(last key)和下邊界(first key)類似,首先判斷是否是否是 (=,<=) 中的一種,如果是,加入界定,繼續(xù)下一個(gè)索引鍵值匹配,如果是(<),加入界定,停止匹配

exp:idx_c1_c2_c3(c1,c2,c3)where c1<=1 and c2=2 and c3<3--> first key (c1,c2,c3)--> c1 為 '<=',加入上邊界界定,繼續(xù)匹配下一個(gè) --> c2 為 '='加入上邊界界定,繼續(xù)匹配下一個(gè) --> c3 為 '<',加入上邊界界定,停止匹配

注:這里簡(jiǎn)單的記憶是,如果比較符號(hào)中包含'='號(hào),'>='也是包含'=',那么該索引鍵是可以被利用的,可以繼續(xù)匹配后面的索引鍵值;如果不存在'=',也就是'>','<',這兩個(gè),后面的索引鍵值就無(wú)法匹配了。同時(shí),上下邊界是不可以混用的,哪個(gè)邊界能利用索引的的鍵值多,就是最終能夠利用索引鍵值的個(gè)數(shù)。

Index Filter

字面理解就是可以用索引去過濾。也就是字段在索引鍵值中,但是無(wú)法用去確定 Index Key 的部分。

exp:idex_c1_c2_c3where c1>=1 and c2<=2 and c3 =1index key --> c1index filter--> c2 c3

這里為什么 index key 只是 c1 呢?因?yàn)?c2 是用來(lái)確定上邊界的,但是上邊界的 c1 沒有出現(xiàn) (<=,=),而下邊界中,c1 是 >=,c2 沒有出現(xiàn),因此 index key 只有 c1 字段。c2,c3 都出現(xiàn)在索引中,被當(dāng)做 index filter.

Table Filter

無(wú)法利用索引完成過濾,就只能用 table filter。此時(shí)引擎層會(huì)將行數(shù)據(jù)返回到 server 層,然后 server 層進(jìn)行 table filter。

四、Between 和 Like 的處理

那么如果查詢中存在 between 和 like,MySQL 是如何進(jìn)行處理的呢?

Between

wherec1 between'a'and'b' 等價(jià)于 wherec1>='a'andc1<='b',所以進(jìn)行相應(yīng)的替換,然后帶入上層模型,確定上下邊界即可

Like

首先需要確認(rèn)的是 % 不能是最在最左側(cè), wherec1 like'%a' 這樣的查詢是無(wú)法利用索引的,因?yàn)樗饕钠ヅ湫枰献钭笄熬Y原則

wherec1 like'a%' 其實(shí)等價(jià)于 wherec1>='a'andc1<'b' 大家可以仔細(xì)思考下。

五、索引的排序

在數(shù)據(jù)庫(kù)中,如果無(wú)法利用索引完成排序,隨著過濾數(shù)據(jù)的數(shù)據(jù)量的上升,排序的成本會(huì)越來(lái)越大,即使是采用了 limit,但是數(shù)據(jù)庫(kù)是會(huì)選擇將結(jié)果集進(jìn)行全部排序,再取排序后的 limit 記錄,而且 MySQL 針對(duì)可以用索引完成排序的 limit 有優(yōu)化,更能減少成本。

Make sure it uses index It is very important to have ORDER BY with LIMIT executed without scanning and sorting full result set, so it is important for it to use index – in this case index range scan will be started and query execution stopped as soon as soon as required amount of rows generated.

存在一張表,c1,c2,c3 上面有索引, selectc1,c2,c3fromt1; 查詢走的是索引全掃描,因此呈現(xiàn)的數(shù)據(jù)相當(dāng)于在沒有索引的情況下 selectc1,c2,c3fromt1 orderbyc1,c2,c3; 的結(jié)果

因此,索引的有序性規(guī)則是怎么樣的呢?

c1=3 —> c2 有序,c3 無(wú)序 c1=3,c2=2 — > c3 有序 c1 in(1,2) —> c2 無(wú)序 ,c3 無(wú)序

有個(gè)小規(guī)律,idxc1c2_c3,那么如何確定某個(gè)字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2 在第二個(gè)位置,只有在 c1 確定一個(gè)值的時(shí)候,c2 才是有序的,如果 c1 有多個(gè)值,那么 c2 將不一定有序,同理,c3 也是類似

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MySQL中show 句法得到表列及整個(gè)庫(kù)的詳細(xì)信息
MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
左匹配原則,聚集索引,回表查詢,索引覆蓋 你真的懂了嗎
一條 sql 的執(zhí)行過程詳解
Mysql Explain 詳解及Extended選項(xiàng)的使用
MySql性能的檢查和調(diào)優(yōu)方法 | 視野
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服