MySQL基礎(十):索引優化

下面是小凰凰的簡介,看下吧!
💗人生態度:珍惜時間,渴望學習,熱愛音樂,把握命運,享受生活
💗學習技能:網絡 -> 雲計算運維 -> python全棧( 當前正在學習中)
💗您的點贊、收藏、關注是對博主創作的最大鼓勵,在此謝過!
有相關技能問題可以寫在下方評論區,我們一起學習,一起進步。
後期會不斷更新python全棧學習筆記,秉着質量博文爲原則,寫好每一篇博文。

一、針對索引失效的十點優化

1、全值匹配我最愛

釋義:索引 idx_staffs_nameAgePos 建立索引時 以 name , age ,pos 的順序建立的。全值匹配表示按順序匹配的

實例:
在這裏插入圖片描述

2、最佳左前綴法則

釋義:如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始並且不跳過索引中的列。
實例(下面實例索引爲NAME_age_pos):
在這裏插入圖片描述第一句口訣:帶頭大哥不能死,也就是說查詢必須要有name,才能使用索引
在這裏插入圖片描述第二句口訣:中間兄弟不能斷,即是age字段沒用到,key不爲NULL,說明用到了索引,key_len相比於上一個圖沒變,因此說明只是Name用到了索引!

3、不在索引列上做任何操作

例如:計算、函數、(自動or手動)類型轉換,會導致索引失效而轉向全表掃描
實例:
在這裏插入圖片描述

4、存儲引擎不能使用索引中範圍條件右邊的列

釋義:範圍 若有索引則能使用到索引,範圍條件右邊的索引會失效(範圍條件右邊與範圍條件使用的同一個組合索引,右邊的纔會失效。若是不同索引則不會失效)
實例:
在這裏插入圖片描述最後一個查詢語句,age>11,這是範圍,後面的pos便會失效!因此key_len不是140,而是78!只有name、age索引有效!

5、儘量使用覆蓋索引

釋義: 只訪問索引的查詢(索引列和查詢列一致),減少select *
實例:
在這裏插入圖片描述第三個key_len爲74,還是隻有name、age用到了索引,範圍之後依舊失效了!覆蓋索引也無法拯救它!

6、mysql避免使用(!= 、<>)

釋義:mysql 在使用不等於(!= 或者<>)的時候無法使用索引會導致全表掃描
實例:
在這裏插入圖片描述

7、is not null 也無法使用索引,但是is null是可以使用索引的

實例:
在這裏插入圖片描述

8、避免使用like的%開頭的匹配

釋義:like以通配符開頭(’%abc…’)mysql索引失效會變成全表掃描的操作
實例:

like%abc%type 類型會變成 all
like%abc’  type 類型會變成 all
like ‘abc%type 類型爲 range ,算是範圍,可以使用索引

在這裏插入圖片描述
問題:解決like '%字符串%'時索引不被使用的方法?
在這裏插入圖片描述在這裏插入圖片描述採用覆蓋索引的方法,可以解決like '%字符串%'時索引不被使用的問題
在這裏插入圖片描述
id是主鍵,因此它也是覆蓋索引!

9、字符串不加單引號索引失效

釋義:底層進行轉換使索引失效,使用了函數講整數轉換成字符串,造成索引失效
實例:
在這裏插入圖片描述

10、少用or,用它來連接時會索引失效

實例:
在這裏插入圖片描述

11、實戰演練

在這裏插入圖片描述

二、優化器對sql語句的自我優化分析

1、自我優化

在這裏插入圖片描述
我們建立的索引是1234,但是我們查詢的時候,是4321,這些都會自動優化成1234,應該儘量避免其優化,因爲優化也是需要開銷的!

2、自我優化+範圍

在這裏插入圖片描述

四個索引全部用到了,因爲自我優化分析之後,範圍就是最後一個了!因此沒有失效的!

3、自我優化+排序

在這裏插入圖片描述索引用於查詢和排序,其中貌似只有兩個索引有效,其實是三個,只是c3索引在排序,而不是查詢,因此沒有顯示,在查詢層面,在c3這一處斷層了,因此c4索引查詢失效!和下面這個語句效果一樣:
在這裏插入圖片描述這時候需要和filesort場景區別開了,看下面:
在這裏插入圖片描述按到c4排序,c4再也不能因爲索引失效而沉默了,因爲我要的結果就是c4排序,因此mysql只能自力更生using filesort!

4、自我優化+order排序的有序性問題

在這裏插入圖片描述自我優化的前提是幾個元素之間位置變動,結果不受影響!比如說and連接的。但是order by c2,c3這個c2和c3位置是不能隨便亂變的,改變了,結果就會變!

建立索引是1234,然而查詢c1索引有效,排序卻是3,2因此索引無法再使用,因此只能使用文件內排序達到目的!c5索引查詢失效!

5、自我優化+order排序有序性問題的特例

在這裏插入圖片描述爲什麼order by c3,c2沒有filesort?因爲c2是常量,不需要排序,因此就相當於order by c3

6、自我優化+group by分組問題

在這裏插入圖片描述分組之前必排序,因此只用到了一個索引,c2,c3索引是用來排序的,c4失效!
在這裏插入圖片描述分組會排序,因此出現文件內排序,但分組多了個having分組,因此還會出現臨時表!group by基本和order by優化基本一致

三、使用索引的一般性建議

1. 對於單鍵索引,儘量選擇針對當前query過濾性更好的索引
2. 在選擇組合索引的時候,當前Query中過濾性最好的字段在索引字段順序中,位置越靠前越好。(避免索引過濾性好的索引失效)
3. 在選擇組合索引的時候,儘量選擇可以能夠包含當前query中的where字句中更多字段的索引
4. 儘可能通過分析統計信息和調整query的寫法來達到選擇合適索引的目的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章