MYSQL的SQL優化,多表連接後有order by排序,出現Using temporary; Using filesort情況

使用EXPLIAN字段可以對sql語句進行分析,當extra有Using temporary; Using filesort等時表示需要進行優化,意思分別是用了臨時表和一種sql的排序。

eg1:

select * from a inner join b where a.id=b.aid order by a.id;這種情況下:

如果a的集合比b小,那麼mysql就會以a爲驅動表,這個時候如果a.id有索引的話,那麼這個索引是起效的,不會出現Using temporary; Using filesort,查詢是高效的。

如果a的集合比b大,那麼mysql就會以b爲驅動表,這個時候如果a.id有索引的話,那麼這個索引是不起效的,order by只能對驅動表進行排序,此時可能會出現Using temporary; Using filesort,在數據量很大的情況下查詢非常慢。

解決:

人爲的對錶進行設置哪個爲驅動表,如left join,或者straight_join(強制把左邊的表設置爲驅動表),然後把order by 字段,加一個索引。

實際問題:

項目中遇到一個頁面要20s才加載好,找到sql語句,發現做了2個查詢,一個是查詢信息,花費10s,另外一個是select count所以時間等同10s,用explian分析:es是主表有15w條記錄,sp表只有14條記錄,所以使用inner join的話mysql會自動優化爲以sp爲驅動表,因爲如果以sp表爲驅動表(排第一個的就是驅動表),那麼只需循環14次去匹配15w的es表是比較高校的,但是這裏需要對es表中的modifytime進行排序,所以先搜全部符合條件,再對其進行排序,而且不能用索引,所以就會Using temporary; Using filesort,而且特別慢。

措施:

改爲straight_join,或者left join

此時,查詢速度已經快了很多,但是使用分析,還是有Using temporary; Using filesort,所以對order by的字段添加索引,這時就能做到最好優化此時,explian全部爲using where。大功告成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章