項目剛剛告一段落,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函數將大於 和小於鏈接起來
可是個人語句中由於還須要排序,因此會形成另外一個額外表,故不採用!
若是哪位大神知道還有其餘方法解決,請留言告知,感激涕零!