索引覆蓋 最左字首 索引下推

2021-10-01 21:42:59 字數 3458 閱讀 4201

什麼是索引覆蓋?

怎麼用到索引覆蓋

索引覆蓋的情況,using index ; using index using where

select * from t where k betwee 3 and 5 這條語句的執行流程是什麼樣的? 邊界查詢

回表的概念是什麼?

索引覆蓋的概念是什麼, 索引覆蓋的優點是什麼?

最左字首原則的概念是什麼? 說明最左字首原則的執行過程.

索引下推的概念是什麼? mysql 5.6 的下推優化是怎麼做的?

查詢的資料在索引樹中可以找到,不需要回到資料樹中去查詢

查詢select 的列必須被where的列(索引)覆蓋,就能使用到索引覆蓋(二級索引)

查詢的列在索引樹中可以查到,where條件為前導列

查詢的列在索引樹中,where條件不是聯合索引的前導列

查詢的列在索引樹中,where是聯合索引前導列的範圍查詢

建表語句

select * from t where k between 3 and 5
sql查詢語句的執行流程:在k索引樹上找到k=3的記錄,取得id=300;

再到id索引樹查到id=300對應的r3;

在k索引樹上找到k=5的記錄,取得id=500;

再在id索引樹上找到id=500對應的r4;

在k索引樹上取得下乙個值k=6,不滿足條件,迴圈結束

在這個過程中,**回到主鍵索引樹搜尋的過程,我們稱為回表,**可以看到,這個查詢流程讀了k索引的3條記錄(1.3.5),回表了兩次(2.4)

如果執行的sql語句是

select id from t where k between 3 and 5
這時只需要查id的值,而id得值已經在k索引樹上了,因此可以直接提供查詢結果,不需要回表,也就是說,在這個查詢裡面,索引k已經」覆蓋了」我們的查詢需求,我們稱為索引覆蓋

由於索引覆蓋可以減少樹的搜尋次數,顯著提公升效能,所以使用索引覆蓋是乙個常用的優化手段

需要注意的是,在引擎內部使用索引覆蓋在索引k的記錄上其實讀了三個記錄,r3~r5(還有後面的一條記錄),但是對於mysql的server來說,他就是找引擎拿到了兩條記錄,因此認為掃瞄行數是2

查詢select 的列必須被where的列(索引)覆蓋,就能使用到索引覆蓋

很好的問題,仔細考慮其中的原因,會有收穫

解答:

like 『j』 或 『j%』 可以使用索引,並且快速定位記錄。

like 『%j』 或 『%j%』,只是在二級索引樹上遍歷查詢記錄,並不能快速 定位(掃瞄了整棵索引樹)。

只有 id 和 uname 欄位時,上述 4 種 like 查詢,uname 索引能滿足 id 和 uname 的查詢情況,不需要回表,所以選擇了使用 uname 的索引樹解決問題。

新增了 age 但無聯合索引 (uname, age) 的情況,如果使用 uname 索引樹,需要回表。在 like 『%j』 或 『%j%』 直接掃瞄主鍵索引樹,現象就是沒有使用 uname 索引。

新增了 age 字段,也新增了 (uname, age) 索引,和第 3 點同理,使用覆蓋索引就能滿足 select * 的字段查詢,不需要回表,因此使用了 (uname, age) 索引樹。但是只有 like 『j』 和 『j%』

能快速定位記錄,而 like 『%j』 和 『%j%』 也能使用該索引樹,但是不能快速定位,需要順序遍歷。

資料量大的時候,二級索引的覆蓋索引會比主鍵查詢快,主鍵索引的記錄的資料量很大,二級索引的資料小,並且索引覆蓋

索引下推是什麼?

索引下推的好處?

索引下推的場景?

select 列不是or不全包括在二級索引中,where中是索引的列有範圍或者模糊查詢的時候,不直接取最左字首回表取資料在做比較,會先比較索引列的其他值,然後在回表,減少回表次數.

索引下推一般可用於所求查詢字段(select列)不是/不全是聯合索引的字段,查詢條件為多條件查詢且查詢條件子句(where/order by)欄位全是聯合索引。

假設表t有聯合索引(a,b),下面語句可以使用索引下推提高效率

select * from t where a > 2 and b > 10;
索引是name age的聯合索引

查詢名字第乙個是張,並且年齡是10歲的所有男孩

mysql> select * from tuser where name like '張%' and age=10 and ismale=1;
這個sql只用到了索引字首的id3

從5.6之前,只能從id3開始乙個乙個回表,到主鍵索引上找到資料行,在對比字段值

而5.6以後引入的索引下推優化(index condition pushdown),可以在遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數.

圖3中,在(name,age)索引裡面我特意去掉了age的值,這個過程innodb並不會看age的值,只是順序的吧」name」第乙個是」張」的記錄一條條取出來回表,因此需要回表4次

圖4和圖3的區別是,innodb在(name,age)索引內部就判斷了age是否等於10,對於不等於10的記錄,直接跳過,在這個例子中,只需要對id4.id5這兩條記錄回表去資料判斷,就只需要回表2次

MySQL 覆蓋索引 最左字首原則 索引下推

索引是高效找到行的乙個方法,當能通過檢索索引就可以讀取想要的資料,那就不需要再到資料表中讀取行了。如果乙個索引包含了 或覆蓋了 滿足查詢語句中字段與條件的資料就叫做覆蓋索引。使用explain,可以通過輸出的extra列來判斷,對於乙個索引覆蓋查詢,顯示為using index,mysql查詢優化器...

mysql中索引最左字首 索引最左字首匹配原則

如果索引字串的前面n個字元都不相同,那麼最好不要索引整個資料列,二十索引前n個字元,這樣可以節省大量空間。如果在資料列a,b,c上建立了復合索引,索引中的資料行按照a b c次序排列,因此資料表會自動的按照a b和a排列,即使指定了a,或者a和b的值,mysql也可以使用這個索引。這個索引可以用於如...

聯合索引最左字首

最左字首匹配原則 之所以會有最左字首匹配原則和聯合索引的索引構建方式及儲存結構是有關係的。首先我們建立的index bcd b,c,d 索引,相當於建立了 b b c b c d 三個索引,看完下面你就知道為什麼相當於建立了三個索引。我們看,聯合索引是首先使用多列索引的第一列構建的索引樹,用上面id...