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


第一條語句

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函數將大於 和小於連接起來

但是我的語句中因為還需要排序,所以會造成另一個額外表,故不采用!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM