第一條語句
explain
select * from tb_wm_shop where is_delete != 1 and is_authentication = 1 ORDER BY create_time DESC
大家應該知道使用order by的 字段要使用索引,這條語句中create_time已經創建了索引,但是計划中並沒有使用該索引,導致出現了Using filesort文件排序,使其查詢變慢
解決方法如下:
從where條件開始,依照順序創建一個組合索引,就可以砍掉Using filesort這個令人討厭的頭顱了
注意:必須依照順序,在創建組合索引時,where條件的字段在orderBy的字段之前,如果orderBy是多字段,則必須依照順序創建
第二條語句
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函數將大於 和小於連接起來
但是我的語句中因為還需要排序,所以會造成另一個額外表,故不采用!