您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何進(jìn)行MYSQL Skip Scan Range小功能的分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
正文
用過MYSQL的都會(huì)被別的數(shù)據(jù)庫的operation 吐槽,索引的建立與使用方面的需要掌握的知識(shí)是比較“矯情的”。為什么這么說,在MYSQL 5.X中如果一個(gè)表中 有這樣的索引,和這樣的查詢,索引的效率就會(huì)大打折扣。
我們來看一下,根據(jù)官方的文檔我們創(chuàng)建下面的數(shù)據(jù)
請(qǐng)準(zhǔn)備MYSQL 8.013以上版本 以及 MYSQL 5.7 版本的兩臺(tái)機(jī)器,并執(zhí)行下面的操作
CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2));
INSERT INTO t1 VALUES
(1,1), (1,2), (1,3), (1,4), (1,5),
(2,1), (2,2), (2,3), (2,4), (2,5);
INSERT INTO t1 SELECT f1, f2 + 5 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 10 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 20 FROM t1;
INSERT INTO t1 SELECT f1, f2 + 40 FROM t1;
ANALYZE TABLE t1;
EXPLAIN SELECT f1, f2 FROM t1 WHERE f2 > 40;
set session optimizer_trace=’enabled=on';
然后我們通過optimizer_trace 來查看這兩個(gè)服務(wù)器上查詢上面的給出的分析結(jié)果
下面的圖形僅僅只給出不同的截圖(這里就不贅述了)
1 MYSQL 5.7 的 row_estimation ,我看可以看到很簡(jiǎn)單
2 下面是MYSQL 8.017 的圖,從下圖看,明顯的MYSQL 8 在查詢計(jì)劃的分析要比 MYSQL 5.7 復(fù)雜的多,其中第二張圖已經(jīng)顯示走了skip_scan
既然看到不同,但問題是這樣有什么用,首先如果是MYSQL 5.7 上基本上走的是 INDEX Scan 而, 而在MYSQL 8 上做的事情要遠(yuǎn)遠(yuǎn)多于 MYSQL5.7 從上圖可以看出,首先查詢先將索引中的前邊的字段,進(jìn)行了group by 的操作,將需要進(jìn)行掃描的數(shù)據(jù)通過第一個(gè)字段劃分了塊,然后在每個(gè)塊中掃描range 的數(shù)據(jù)。
這樣的好處也是顯而易見的,如果將數(shù)據(jù)掃描進(jìn)行分塊處理,有些不包含range 的數(shù)據(jù)塊將不被掃描,或者不包含range 的行也將不被掃描。
這項(xiàng)功能也是有一定要求的
1 必須單表
2 不能有g(shù)roup distinct 的操作
3 索引兩邊的字段都可以包含NULL ,但中間的字段不可以有NULL
下面在做一個(gè)測(cè)試確認(rèn)一下前邊有兩個(gè)字段的情況下,是不是也是可以走skip scan index
CREATE TABLE t2 (f1 INT NOT NULL, f2 INT NOT NULL,f3 int not null);
INSERT INTO t2 VALUES
(1,1,2), (1,2,3), (1,3,4), (1,4,5), (1,5,6),
(2,1,3), (2,2,4), (2,3,6), (2,4,2), (2,5,4);
INSERT INTO t2 SELECT f1, f2 + 5,f3 + 2 FROM t2;
INSERT INTO t2 SELECT f1, f2 + 10,f3 + 4 FROM t2;
INSERT INTO t2 SELECT f1, f2 + 20, f3 + 5 FROM t2;
INSERT INTO t2 SELECT f1, f2 + 4, f3 + 6 FROM t2;
ANALYZE TABLE t1;
create index ix_t2_f2_f3 on t2 (f1,f2,f3);
最終的結(jié)果還是可以走的,其實(shí)可以理解為,前邊將兩個(gè)沒有條件的字段都變?yōu)橛芯唧w值的條件匹配后面的字段的范圍查詢。
這個(gè)做法在ORACLE 早就是有的功能,目前MYSQL 也繼承了這個(gè)功能。
上述內(nèi)容就是如何進(jìn)行MYSQL Skip Scan Range小功能的分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。