索引失效

查看執⾏計劃
介紹
MySQL 提供了⼀個 EXPLAIN 命令, 它能夠對 SELECT 語句的執⾏計劃進⾏分析, 並輸出 SELECT 執⾏的詳細信息, 以供開發⼈員針對性優化.
使⽤explain這個命令來查看⼀個這些SQL語句的執⾏計劃,查看該SQL語句有沒有使⽤上了索引,有沒有作全表掃描,這均可以經過explain命令來查看。
能夠經過explain命令深⼊瞭解MySQL的基於開銷的優化器,還能夠得到不少可能被優化器考慮到的訪問策略的細節,以及當運⾏SQL語句時哪一種策略預計會被優化器採⽤。
EXPLAIN 命令⽤法⼗分簡單, 在 SELECT 語句前加上 explain 就能夠了, 例如:
image.pngmysql

參數說明
expain出來的信息有10列,分別是
id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extrasql

id
每一個 SELECT語句都會⾃動分配的⼀個惟⼀標識符.
表示查詢中操做表的順序,有三種狀況:
id相同:執⾏順序由上到下
id不一樣:若是是⼦查詢,id號會⾃增,id越⼤,優先級越⾼。
id相同的不一樣的同時存在
id列爲null的就表示這是⼀個結果集,不須要使⽤它來進⾏查詢。數據庫

select_type(重要)
查詢類型,主要⽤於區別普通查詢、聯合查詢(union、union all)、⼦查詢等複雜查詢。segmentfault

simple
表示不須要union操做或者不包含⼦查詢的簡單select查詢。有鏈接查詢時,外層的查詢爲simple,且只有⼀個併發

primary
⼀個須要union操做或者含有⼦查詢的select,位於最外層的單位查詢的select_type即爲primary。且只有⼀個函數

subquery
除了from字句中包含的⼦查詢外,其餘地⽅出現的⼦查詢均可能是subquery性能

dependent subquery
與dependent union相似,表示這個subquery的查詢要受到外部表查詢的影響優化

union
union鏈接的兩個select查詢,第⼀個查詢是PRIMARY,除了第⼀個表外,第⼆個之後的表select_type都是unionspa

dependent union
與union⼀樣,出如今union 或union all語句中,可是這個查詢要受到外部查詢的影響.net

union result
包含union的結果集,在union和union all語句中,由於它不須要參與查詢,因此id字段爲null

derived
from字句中出現的⼦查詢,也叫作派⽣表,其餘數據庫中可能叫作內聯視圖或嵌套select

table
顯示的查詢表名,若是查詢使⽤了別名,那麼這⾥顯示的是別名
若是不涉及對數據表的操做,那麼這顯示爲null
若是顯示爲尖括號括起來的就表示這個是臨時表,後邊的N就是執⾏計劃中的id,表示結果來⾃於這個查詢產⽣。
若是是尖括號括起來的,與相似,也是⼀個臨時表,表示這個結果來⾃於union查詢的id爲M,N的結果集。

type(重要)
依次從好到差:
system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL
除了all以外,其餘的type均可以使⽤到索引,除了index_merge以外,其餘的type只能夠⽤到⼀個索引
注意事項:最少要索引使⽤到range級別。

system
表中只有⼀⾏數據或者是空表。

const(重要)
使⽤惟⼀索引或者主鍵,返回記錄⼀定是1⾏記錄的等值where條件時,一般type是const。其餘數據庫也叫作惟⼀索引掃描

eq_ref(重要)
關鍵字:鏈接字段主鍵或者惟⼀性索引。
此類型一般出如今多表的 join 查詢, 表示對於前表的每⼀個結果, 都只能匹配到後表的⼀⾏結果. 而且查詢的⽐較操做一般是 '=', 查詢效率較⾼.

ref(重要)
針對⾮惟⼀性索引,使⽤等值(=)查詢⾮主鍵。或者是使⽤了最左前綴規則索引的查詢。

fulltext
全⽂索引檢索,要注意,全⽂索引的優先級很⾼,若全⽂索引和普通索引同時存在時,mysql無論代價,優先選擇使⽤全⽂索引

ref_or_null
與ref⽅法相似,只是增長了null值的⽐較。實際⽤的很少。

unique_subquery
⽤於where中的in形式⼦查詢,⼦查詢返回不重複值惟⼀值

index_subquery
⽤於in形式⼦查詢使⽤到了輔助索引或者in常數列表,⼦查詢可能返回重複值,可使⽤索引將⼦查詢去重。

range(重要)
索引範圍掃描,常⻅於使⽤>,<,is null,between ,in ,like等運算符的查詢中。

index_merge
表示查詢使⽤了兩個以上的索引,最後取交集或者並集,常⻅and ,or的條件使⽤了不一樣的索引,官⽅排序這個在ref_or_null以後,可是實際上因爲要讀取所個索引,性能可能⼤部分時間都不如range

index(重要)
關鍵字:條件是出如今索引樹中的節點的。可能沒有徹底匹配索引。
索引全表掃描,把索引從頭至尾掃⼀遍,常⻅於使⽤索引列就能夠處理不須要讀取數據⽂件的查詢、可使⽤索引排序或者分組的查詢。

all(重要)
這個就是全表掃描數據⽂件,而後再在server層進⾏過濾返回符合要求的記錄。

possible_keys
這次查詢中可能選⽤的索引,⼀個或多個

key
查詢真正使⽤到的索引,select_type爲index_merge時,這⾥可能出現兩個以上的索引,其餘的select_type這⾥只會出現⼀個。

key_len
⽤於處理查詢的索引⻓度,若是是單列索引,那就整個索引⻓度算進去,若是是多列索引,那麼查詢不⼀定都能使⽤到全部的列,具體使⽤到了多少個列的索引,這⾥就會計算進去,沒有使⽤到的列,這⾥不會計算進去。
留意下這個列的值,算⼀下你的多列索引總⻓度就知道有沒有使⽤到全部的列了。
另外,key_len只計算where條件⽤到的索引⻓度,⽽排序和分組就算⽤到了索引,也不會計算到key_len中。

ref
若是是使⽤的常數等值查詢,這⾥會顯示const
若是是鏈接查詢,被驅動表的執⾏計劃這⾥會顯示驅動表的關聯字段
若是是條件使⽤了表達式或者函數,或者條件列發⽣了內部隱式轉換,這⾥可能顯示爲func

rows
這⾥是執⾏計劃中估算的掃描⾏數,不是精確值(InnoDB不是精確的值,MyISAM是精確的值,主要緣由是InnoDB⾥⾯使⽤了MVCC併發機制)

extra(重要)
這個列包含不適合在其餘列中顯示單⼗分重要的額外的信息,這個列能夠顯示的信息⾮常多,有⼏⼗種,常⽤的有

using temporary
表示使⽤了臨時表存儲中間結果。
MySQL在對查詢結果order by和group by時使⽤臨時表
臨時表能夠是內存臨時表和磁盤臨時表,執⾏計劃中看不出來,須要查看status變量,used_tmp_table,used_tmp_disk_table才能看出來。

no tables used
不帶from字句的查詢或者From dual查詢
使⽤not in()形式⼦查詢或not exists運算符的鏈接查詢,這種叫作反鏈接
即,⼀般鏈接查詢是先查詢內表,再查詢外表,反鏈接就是先查詢外表,再查詢內表。

using fifilesort(重要)
排序時⽆法使⽤到索引時,就會出現這個。常⻅於order by和group by語句中
說明MySQL會使⽤⼀個外部的索引排序,⽽不是按照索引順序進⾏讀取。
MySQL中⽆法利⽤索引完成的排序操做稱爲「⽂件排序」

using index(重要)
查詢時不須要回表查詢,直接經過索引就能夠獲取查詢的數據。
表示相應的SELECT查詢中使⽤到了覆蓋索引(Covering Index),避免訪問表的數據⾏,效率不錯!
若是同時出現Using Where ,說明索引被⽤來執⾏查找索引鍵值
若是沒有同時出現Using Where ,代表索引⽤來讀取數據⽽⾮執⾏查找動做。

using where(重要)
表示存儲引擎返回的記錄並非全部的都滿⾜查詢條件,須要在server層進⾏過濾。
查詢條件中分爲限制條件和檢查條件,5.6以前,存儲引擎只能根據限制條件掃描數據並返回,而後server層根據檢查條件進⾏過濾再返回真正符合查詢的數據。5.6.x以後⽀持ICP特性,能夠把檢查條件也下推到存儲引擎層,不符合檢查條件和限制條件的數據,直接不讀取,這樣就⼤⼤減小了
存儲引擎掃描的記錄數量。extra列顯示using index condition

fifirstmatch(tb_name)
5.6.x開始引⼊的優化⼦查詢的新特性之⼀,常⻅於where字句含有in()類型的⼦查詢。若是內表的數據量⽐較⼤,就可能出現這個
loosescan(m..n)
5.6.x以後引⼊的優化⼦查詢的新特性之⼀,在in()類型的⼦查詢中,⼦查詢返回的可能有重複記錄時,就可能出現這個
除了這些以外,還有不少查詢數據字典庫,執⾏計劃過程當中就發現不可能存在結果的⼀些提示信息

fifiltered
使⽤explain extended時會出現這個列,5.7以後的版本默認就有這個字段,不須要使⽤explain extended了。這個字段表示存儲引擎返回的數據在server層過濾後,剩下多少滿⾜查詢的記錄數量的⽐例,注意是百分⽐,不是具體記錄數。

參考⽹站

https://segmentfault.com/a/11...
https://blog.csdn.net/rewiner...

相關文章
相關標籤/搜索