Mysql-explain之Using temporary和Using filesort解決方案

項目剛剛告一段落,boos又讓優化幾個主要界面函數

程序代碼方便的優化就不講了,主要說MySQL的優化優化

首先查看explain執行計劃,讓主要查詢語句使用索引,索引type級別最好達到ref | ref_eq級別spa

其次將extra一欄的Using temporary(臨時表)、Using filesort(文件排序)拖出去砍了.net

第一條語句3d

explain
select * from tb_wm_shop where is_delete != 1 and is_authentication = 1 ORDER BY create_time DESCblog

 

 

 你們應該知道使用order by的 字段要使用索引,這條語句中create_time已經建立了索引,可是計劃中並無使用該索引,致使出現了Using filesort文件排序,使其查詢變慢排序

解決方法以下:索引

從where條件開始,依照順序建立一個組合索引,就能夠砍掉Using filesort這個使人討厭的頭顱了get

注意:必須依照順序,在建立組合索引時,where條件的字段在orderBy的字段以前,若是orderBy是多字段,則必須依照順序建立it

詳情可參考連接:http://www.javashuo.com/article/p-evonndrz-bb.html

 

 

第二條語句

 

 explain
select s.* from tb_wm_popularize p left join tb_wm_shop s on p.shop_id = s.id where s.is_delete != 1 AND p.type = 1 order by s.sale_num desc

這條語句就比較討人厭了,同時出現了Using temporary(臨時表)、Using filesort(文件排序)

一個小時的百度,找到了緣由

其一,參考:https://www.iteye.com/blog/hudeyong926-785181

發現了錯誤一:左聯接表時,若是orderBy使用的字段是第二張表的字段就會照成Using temporary,修改語句如下是結果

 

 

 發現結果仍是沒變,通過確認以上連接的真實性,引出了第二個問題:

and p.type = 1 這個致使了查詢以後又將p 表 引爲了第一張表,致使第一個問題解決以後任然沒有生效,就有了如下改動:

 

如今臨時表沒有了,開始解決剩下的Using filesort

 上面已經說了,創建一個sale_num的索引就能夠了,不過個人語句裏面還有一個錯誤,就是 != 會致使語句不走索引,因程序業務邏輯符合條件 改成is_delete = 0完成優化

 

 

至於上面所說的 != 致使不走索引,目前沒有發現什麼好的方法解決,百度出來有一種方法是經過union函數將大於 和小於鏈接起來

可是個人語句中由於還須要排序,因此會形成另外一個額外表,故不採用!

若是哪位大神知道還有其餘方法解決,請留言告知,感激涕零!

相關文章
相關標籤/搜索