经过以上对单表查询、复合查询不一样状况下的查询分析和测试,对查询优化器有了更深刻的理解。同时,经过以上测试,也发现不少在查询中应该优化或者规避的策略,这些策略能够有效的优化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