MySQLexplain之possible_keys、key及key_len詳解
MySQLexplain之possible_keys、key及key_len
possible_keys
顯示可能應(yīng)用在這張表中的索引,一個或多個。
查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用
key
實際使用的索引。如果為NULL,則沒有使用索引
查詢中若使用了覆蓋索引,則該索引和查詢的selet字段重疊,僅出現(xiàn)在key列表中。
覆蓋索引:查詢的字段與所建索引的字段個數(shù)和順序剛好吻合

key_len
表示索引中使用的字節(jié)數(shù),可通過該列計算查詢中使用的索引的長度。
在不損失精確性的情況下,長度越短越好key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據(jù)表定義計算而得,不是通過表內(nèi)檢索出的

mysql索引possible_keys,key問題
explain中有兩個字段possible_keys,key。
possible_keys:表示可能用到的索引。key:實際使用到的索引。
為什么會有單獨的兩列?
你的where條件中如果使用到了索引列字段,那么possible_keys會列出索引字段對應(yīng)的索引。
mysql可能會使用到他, 但是要看實際情況,什么是實際情況?
打個比方,如果你有一個按照日期創(chuàng)建的索引列,每天插入一條數(shù)據(jù),插入了一年,那么就有365條數(shù)據(jù)。
這個時候你的搜索條件是查詢昨天的數(shù)據(jù),sql類似于:
where create_date? > '昨天'?
explain結(jié)果如下:

幾個關(guān)鍵點:
type:range 表示你的sql適合范圍查詢possible_keys:表示mysql可能會用到的索引(也就是create_date字段對應(yīng)的索引)。key:實際用到的索引。rows:1 如果查詢優(yōu)化器決定使用全表掃描的方式對某個表執(zhí)行查詢時,執(zhí)行計劃的 rows 列就代表預(yù)計需要掃描的行數(shù),如果使用索引來執(zhí)行查詢時,執(zhí)行計劃的 rows 列就代表預(yù)計掃描的索引記錄行數(shù)
因為我們只查昨天的,一天一條數(shù)據(jù),所以這里是1。
extra:Using index condition; 表示有些搜索條件中雖然出現(xiàn)了索引列,但卻不能使用到索引(這個是不是和possible_keys沖突了?有待驗證)
然后我們換一個查詢方式,查昨天之前的364天的數(shù)據(jù),sql類似如下:

幾個關(guān)鍵點:
type:all 表示你的sql適合范圍查詢possible_keys:表示mysql可能會用到的索引(也就是create_date字段對應(yīng)的索引)。key:實際用到的索引。rows:1041 如果查詢優(yōu)化器決定使用全表掃描的方式對某個表執(zhí)行查詢時,執(zhí)行計劃的 rows 列就代表預(yù)計需要掃描的行數(shù),如果使用索引來執(zhí)行查詢時,執(zhí)行計劃的 rows 列就代表預(yù)計掃描的索引記錄行數(shù)
因為我們只查昨天之前的,所以數(shù)據(jù)量是1041條。
好了,得出的結(jié)論就是possible_keys會列出你的where條件中可能會使用到的索引列,但是具體用不到這個索引,是需要根據(jù)你的實際情況來的,如果你的條件,使用到索引和不使用到索引所消耗的效果差不錯(磁盤io,數(shù)據(jù)讀取等)。
舉例來說就是上面的例子,一個條件查詢了表中的百分之99的數(shù)據(jù),即使你的where條件中使用到了索引(并且使用了正確使用索引的姿勢。),那么優(yōu)化器也會選擇放棄使用這個索引,因為你使用了這個索引,還會額外帶來回表的代碼,那么還不如直接全表掃描。
那么他就會直接放棄使用這個索引,直接進行全表掃描。反之,如果你的數(shù)據(jù)查詢確實是非常的減少磁盤io這些,那么優(yōu)化器就會使用你這個索引。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決mybatis查詢結(jié)果為null時,值被默認值替換問題
這篇文章主要介紹了解決mybatis查詢結(jié)果為null時,值被默認值替換問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
MySQL中的JSON_CONTAINS函數(shù)舉例詳解
這篇文章主要給大家介紹了關(guān)于MySQL中JSON_CONTAINS函數(shù)舉例詳解的相關(guān)資料,MySQL JSON_CONTAINS函數(shù)可用于判斷JSON數(shù)組中是否包含某個元素,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-12-12
Navicat連接服務(wù)器MySQL數(shù)據(jù)庫步驟及遇到錯誤和問題
Navicat是一款強大的數(shù)據(jù)庫管理工具,可以用來遠程連接MySQL服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于Navicat連接服務(wù)器MySQL數(shù)據(jù)庫步驟及遇到錯誤和問題的相關(guān)資料,文中通過代碼及圖文介紹的非常詳細,需要的朋友可以參考下2024-07-07
MySQL主從復(fù)制延遲原因分析、判斷方法與優(yōu)化方案
在 MySQL 主從架構(gòu)的生產(chǎn)環(huán)境中,主從復(fù)制延遲是最常見、最影響業(yè)務(wù)穩(wěn)定性的問題之一,今天我把實戰(zhàn)中總結(jié)的延遲核心原因、精準判斷方法、可落地優(yōu)化方案全流程整理出來,希望能幫大家徹底搞定主從延遲問題,需要的朋友可以參考下2026-03-03
mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄
在MySQL中我們常常用order by來進行排序,使用limit來進行分頁,下面這篇文章主要給大家介紹了關(guān)于mysql中l(wèi)imit查詢踩坑的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03
與MSSQL對比學(xué)習(xí)MYSQL的心得(六)--函數(shù)
這一節(jié)主要介紹MYSQL里的函數(shù),MYSQL里的函數(shù)很多,我這里主要介紹MYSQL里有而SQLSERVER沒有的函數(shù)2014-08-08

