mysql的explain執行計劃的描述,實習遇到的對之前沒有重視到的type和extra

liang302發表於2024-06-27

實習遇到的最佳化mysql慢查詢的問題。
截個圖回憶下

這裡重點記錄下typeextra的區別

Type:(這裡選擇的不根據你語句中select 的內容)

Const :如果唯一索引而且where的列是唯一索引 ,而且你搜尋的值對應資料型別如果是int搜尋的是int 不需要轉轉化(需要轉化就不是const(常量值))。是int的話怎麼都會用上常數。 如果是對應的資料型別是char但是搜尋用int但是找不到,就會顯示無使用索引。如果對應的資料型別是char還需要轉化,無論是否找到資料都會顯示type = index的索引
eq_ref : 如果搜尋的是 join && 命中主鍵或非空唯一索引 && 等值連線
ref : 如果搜尋的是 join && 命中被驅動表的普通非唯一索引 && 等值連線
又或者單表 命中普通非唯一索引
Range :範圍查詢
index:搜尋的是 count等需要全表的函式
搜尋的是 雖然有索引但是where型別不匹配的單表
:需要掃描索引上的全部資料,只比全表掃描快一點
all:沒有使用索引 走全表 (where 計算 或 函式 或 欄位型別不一樣 + 找資料中不同列相同的資料 + or/in/exist/not in/not exist 看成本計算(主要IO成本 +CPU成本) )

extra:(開始根據你的select的內容)

Using where+using index :使用到聯合索引但是沒嚴格遵守最左字首,使用範圍查詢
Using index:覆蓋索引,不需要回表
Using where:沒有用到索引或雖然where有對應索引條件但是select 的內容沒有在索引中被覆蓋
Using index condition:使用索引條件
Using join buffer(使用連線快取):MySQL join使用了連線快取。

當時的問題就是索引的最佳化,因為刪除了一個欄位,需要重新計算對應的索引修改成什麼。修改了之後,會出現最後有沒有走新索引的問題?我當時重新複習然後實踐檢驗這些各個欄位來判定速度的快慢。

加索引前,如果資料量太大,先考慮能不能修改mysql資料的長度

比如我那個時候,先刪了索引,然後把varchar255轉成varchar64了之後,再加索引的時候的速度再重建的速度快。

除了explain還可以用optimizer_trace 。一些文章

最後因為導師給我的許可權只是開發環境的許可權,資料大部分是自己造的,一些效率的執行問題沒怎麼看出來。

相關文章