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

2021-09-24 14:56:15 字數 1875 閱讀 5757

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

*考慮以下的場景:

表t1有乙個聯合索引idx_u1(rank1,rank2), 但是查詢的時候卻沒有rank1這列,只有rank2。

比如,select * from t1 where rank2 = 30.那以前遇到這樣的情況,如果沒有針對rank2這列單獨建立普通索引,這條sql怎麼著都是走的full table scan。iss就是在這樣的場景下產生的。iss 可以在查詢過濾組合索引不包括最左列的情況下,走索引掃瞄,而不必要單獨建立額外的索引。因為畢竟額外的索引對寫開銷很大,能省則省。

還是那剛才的例子來講,假設:

表t1的兩個欄位rank1,rank2。

有這樣的記錄,

rank1, rank2

1100

1200

1300

1400

1500

1600

1700

5100

5200

5300

5400

5500

我們給出的sql是,

select

*from t1 where rank2 >

400;

那mysql通過iss把這條sql變為,

select

*from t1 where rank1=

1and rank2 >

400union

allselect

*from t1 where rank1 =

5and rank2 >

400;

可以看出來,mysql其實內部自己把左邊的列做了一次distinct,完了加進去。

我們拿實際的例子來看下,假設:

還是剛才描述那張表,rank1字段值的distinct值比較少,查詢計畫的對比,

關閉iss,

很顯然,iss 掃瞄的行數要比之前的少很多。

iss其實恰好適合在這種左邊欄位的唯一值較少的情況下,效率來的高。比如性別,狀態等等。

那假設,rank1欄位的distinct值比較多呢?

我們重新造了點資料,這次,rank1的唯一值個數有快上萬個

我們來再次看一遍這樣sql的執行計畫,

這次我們發現,無論如何mysql也不會選擇iss,而選了full index scan。那這樣的場景就必須給rank2加乙個單獨索引了

那來總結下iss就是一句話:iss 其實就是 mysql 8.0 推出的適合聯合索引左邊列唯一值較少的情況的一種優化策略

MYSQL8 0全文索引使用

概述 在一堆文字中找到含有關鍵字的應用。當然也可以用以下語句實現 select from 表名 where 欄位名 like abc 但是它的效率太低,是全盤掃瞄。mysql 提供了更高效的方法全文索引 fulltext 重要 mysql 5.6之前版本,只有myisam支援全文索引,5.6之後,i...

Mysql8 0新增特性

1.資料字典 新增了事務型的資料字典,用來儲存資料庫物件資訊 之前,字典資料是儲存在元資料檔案和非事務型表中的 2.賬號許可權管理 新增了對 角色 的支援,角色會對應一套許可權,角色可以被新增 刪除,角色上的許可權也可以進行增刪 可以對使用者賬號新增和刪除角色 3.innodb 提公升 完善了對自增...

MySQL 8 0的新特性(二)

8.0 版本提供對地形的支援,其中包括了對空間參照系的資料來源資訊的支援,srs aware spatial資料型別,空間索引,空間函式。總而言之,8.0版本可以理解地球表面的經緯度資訊,而且可以在任意受支援的5000個空間參照系中計算地球上任意兩點之間的距離。st spatial referenc...