實習遇到的最佳化mysql慢查詢的問題。
截個圖回憶下
這裡重點記錄下type和extra的區別
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了之後,再加索引的時候的速度再重建的速度快。