經過以上對單表查詢、複合查詢不一樣狀況下的查詢分析和測試,對查詢優化器有了更深刻的理解。同時,經過以上測試,也發現不少在查詢中應該優化或者規避的策略,這些策略能夠有效的優化SQL語句,減小執行時間。函數
具體的策略總結以下:性能
一、使用具體的字段名取代‘*’。由於在查詢處理過程當中,查詢優化器在setup_wild()函數中會首先將‘*’轉化爲具體的具體的表中的字段。測試
二、使用具體數據表的字段名取代字段名。即:使用TABLE.FIELD取代FIELD。由於在查詢處理中,特別是多表聯合查詢中,查詢優化器在set_field()函數中對不給定具體表名的字段會對全部表進行查詢該字段。優化
三、使用GROUP條件取代DISTINCT條件。由於在查詢處理中,查詢優化器會在優化階段中調用create_distinct_group()函數,將DISTINCT條件轉化爲GROUP條件來處理。索引
四、使用LIMIT條件。在查詢結果太多的狀況下,查詢執行階段會使用LIMIT過濾查詢結果,能夠有效的下降查詢的時間。im
五、‘,’、JOIN、INNER JOIN、CROSS JOIN在MySQL中是等價的。從查詢處理邏輯能夠看出,最終JOIN、INNER JOIN、CROSS JOIN會轉化爲多表的聯合查詢。而且對於內鏈接查詢來講,ON條件和where條件是同樣的,ON條件會在simplify_joins()函數中添加到where條件中。總結
六、LEFT JOIN查詢會將左部的表的進行全表掃描,而右部的表中若是沒有匹配的記錄時,會用NULL值填充。而當數據表不能 NULL表時(與是否有where條件過濾有關),則左部不會所有列出全部記錄,並將外鏈接轉化爲多表聯合查詢處理。其餘的外鏈接JOIN查詢與LEFT JOIN查詢相似,再也不贅述。特別注意,OUTER JOIN的where條件和ON條件有一些區別:ON條件是在生成查詢結果以前,進行的過濾;where條件是在查詢結果輸出過程當中進行的過濾。所以,將過濾條件寫到where條件中時,LEFT JOIN查詢不會顯示左部的全部記錄,而是得到符合條件的記錄。LEFT JOIN的詳細分析和測試,將做爲單獨的部分呈現。數據
七、STRAIGHT_JOIN查詢用於在多表查詢時指定表載入的順序。而在指定載入順序時,要按照表的關聯關係進行指定,不然STAIGHT_JOIN會忽略指定順序,而經過查詢優化器進行優化。若是對查詢不能保證指定順序爲最優的狀況下,不建議使用STAIGHT_JOIN指定載入的順序。查詢
八、轉化子查詢爲多表聯合查詢。子查詢須要建立臨時表,而且查詢的臨時結果沒有任何索引,致使查詢性能較低。轉化爲多表聯合查詢能夠不須要建立臨時表,而且能夠有效的利用查詢數據表的索引。di