MySQL8 0之跳躍範圍掃瞄

2021-09-13 09:54:25 字數 3477 閱讀 7121

跳躍範圍掃瞄是mysql在8.0.13版本新增加的用於提高效能的新特性,跳躍範圍掃瞄可以使以前部分無法使用到聯合索引的sql利用聯合索引進行查詢,並且可以更高效的利用聯合索引,這對於使用mysql聯合索引進行查詢的應用意義重大。

通過乙個示例來解釋跳躍範圍掃瞄:

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\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: t1

partitions: null

type: range

possible_keys: primary

key: primary

key_len: 8

ref: null

rows: 53

filtered: 100.00

extra: using where; using index for skip scan

1 row in set, 1 warning (0.00 sec)

mysql> select version();

+-----------+

| version() |

+-----------+

| 8.0.15 |

+-----------+

1 row in set (0.00 sec)

在這個示例中,select f1,f2 from t1 where f2>40在8.0.13版本之前是通過索引全掃瞄的方式來獲取最終的結果集,因為select查詢的字段全部都是索引的組成部分。mysql通過索引全掃瞄獲取所有的行記錄,然後通過f2 > 40這個條件過濾,最終篩選出結果集返回給客戶端。

眾所周知,索引範圍掃瞄的效率肯定是要高於索引全掃瞄的,在這個示例中,雖然查詢條件是f2 > 40,屬於範圍查詢,但是where條件中不包含f1欄位的的條件,所以無法使用索引範圍掃瞄的方式過濾資料。在mysql-8.0.13版本增加的跳躍範圍掃瞄特性,就是針對類似的場景的優化,跳躍範圍掃瞄在這個示例中實際是針對每乙個f1欄位的值,進行了範圍掃瞄,即進行了多次範圍掃瞄。

針對這個示例,具體的跳躍範圍掃瞄過程如下:

獲取聯合索引中第乙個字段f1的第乙個值:f1 = 1將獲取到的值和where條件中的f2的條件組合:f1 = 1 and f2 > 40執行這個範圍掃瞄查詢

獲取聯合索引中第乙個字段f1的第二個值:f1 = 2將獲取到的值和where條件中的f2的條件組合:f1 = 2 and f2 > 40執行這個範圍掃瞄查詢

將兩次範圍掃瞄查詢的結果合併返回給客戶端

跳躍範圍掃瞄實際就是將一些全掃瞄的場景拆分成多個範圍掃瞄,利用範圍掃瞄的效率高於全掃瞄的效率,最終實現提高sql效率。

在這個示例中,比較有跳躍範圍掃瞄特性的sql執行計畫以及沒有跳躍範圍掃瞄特性的sql執行計畫:

# 有跳躍範圍掃瞄特性

mysql> explain select f1, f2 from t1 where f2 > 40\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: t1

partitions: null

type: range

possible_keys: primary

key: primary

key_len: 8

ref: null

rows: 53

filtered: 100.00

extra: using where; using index for skip scan

1 row in set, 1 warning (0.00 sec)

# 沒有跳躍範圍掃瞄特性

mysql> explain select f1, f2 from t1 where f2 > 40\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: t1

partitions: null

type: index

possible_keys: null

key: primary

key_len: 8

ref: null

rows: 160

filtered: 33.33

extra: using where; using index

1 row in set, 1 warning (0.00 sec)

通過執行計畫可以看到,有跳躍範圍掃瞄特性的查詢掃瞄的行數更少且過濾性更高。

下面來說說跳躍範圍掃瞄使用一些限制以及場景:

跳躍範圍掃瞄預設是開啟的,有兩種方式可以關閉跳躍範圍掃瞄特性:

對於使用了跳躍範圍掃瞄特性的sql,使用explain檢視其執行計畫,可以看到:

跳躍範圍掃瞄是對使用mysql聯合索引查詢的sql意義重大,能在使sql查詢效率更高,但是並不是使用到跳躍範圍掃瞄就能代表sql執行效率更高。在mysql一些開發規範中,一般要求建立聯合索引時將重複值少的字段放在聯合索引前面,將重複值多的字段放在聯合索引後面,方便sql在使用聯合索引時通過前面的字段快速過濾結果。但是在跳躍範圍掃瞄特性中,是遍歷前面欄位的值,與後續欄位的範圍查詢條件組合,進行範圍掃瞄查詢,那對於重複值少的字段會被拆分成多個範圍掃瞄查詢,在實際使用過程中並不一定會比索引全掃瞄效率更高。

所以個人覺得跳躍範圍掃瞄適用於聯合索引中前導列distinct值較少,後續字段選擇過濾性又比較好的場景,能更好的發揮跳躍範圍掃瞄的作用。

MySQL 8 0 索引特性2 索引跳躍掃瞄

mysql 8.0 實現了index skip scan,翻譯過來就是索引跳躍掃瞄。熟悉oracle的朋友是不是發現越來越像oracle了?再者,熟悉 mysql 5.7 的朋友是不是覺得這個很類似當時優化器的選項mrr?好了,先具體說下什麼 iss,我後面全部用 iss 簡稱。考慮以下的場景 表t...

mysql8 0提示命令 MySQL8 0操作命令

mysql8.0版本和mysql5.0的加密規則不一樣,而現在的很多任務具等都是不支援的,我們這裡使用的是將mysql使用者登入的加密規則修改為mysql native password的方法來進行解決的。修改加密規則alter user root localhost identified by p...

mysql8 0修改登入

在mysql8.0當中的密碼認證外掛程式以經由mysql native password改為caching sha2 password 修改密碼的方式也發生了改變,控制台修改密碼方法如下 use mysql alter user root localhost identified by 新密碼 修改...