使用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。大功告成