跳躍範圍掃瞄是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 新密碼 修改...