读书人

EXPLAIN sql优化步骤(2) Using tem

发布时间: 2012-08-25 10:06:20 作者: rapoo

EXPLAIN sql优化方法(2) Using temporary ; Using filesort

  • select A.id,A.title,B.title from jos_content? A left join jos_categories B on A.catid=B.id left join jos_sections C? on A.sectionid=C.idselect?A.id,A.title,B.title from jos_content? A,jos_categories B,jos_sections C where A.catid=B.id and? A.sectionid=C.idselect?A.id,A.title,B.title from jos_content A left? join jos_categories B on A.catid=B.id left join jos_sections C on? A.sectionid=C.id order by rand() limit 10select?A.id from? jos_content A left join jos_categories B on B.id=A.catid left join? jos_sections C on A.sectionid=C.id order by A.id

    结果是第(1)条平均用时20s,第(2)条平均用时44s,第(3)条平均用时70s,第(4)条平均用时2s。而且假如我们用explain观察第(3)条语句的执行情况,会发现它创建了temporary表来进行排序。

    综上所述,可以得出如下结论:
    1. 对需要查询和排序的字段要加索引。
    2. 在一定环境下,left join还是比普通连接查询效率要高,但是要尽量少地连接表,并且在做连接查询时注意观察索引是否起了作用。
    3. 排序尽量对第一个表的索引字段进行,可以避免mysql创建临时表,这是非常耗资源的。
    4. 对where条件里涉及到的字段,应适当地添加索引,这样会对排序操作有优化的作用。
    5.在做随机抽取数据的需求时,避免使用order by rand(),从上面的例子可以看出,这种是很浪费数据库资源的,在执行过程中用showprocesslist查看,会发现第(3)条有Copying to tmp table ondisk。而对(3)和(4)的对比得知,如果要实现这个功能,最好另辟奚径,来减轻Mysql的压力。
    6.从第4点可以看出,如果说在分页时我们能先得到主键,再根据主键查询相关内容,也能得到查询的优化效果。通过国外《High PerformanceMySQL》专家组的测试可以看出,根据主键进行查询的类似“SELECT ... FROM... WHERE id =...”的SQL语句(其中id为PRIMARYKEY),每秒钟能够处理10000次以上的查询,而普通的SELECT查询每秒只能处理几十次到几百次。涉及到分页的查询效率问题,网上的可用资源越来越多,查询功能也体现出了它的重要性。也便是sphinx、lucene这些第三方搜索引擎的用武之地了。
    7. 在平时的作业中,可以打开Mysql的Slow queries功能,经常检查一下是哪些语句降低的Mysql的执行效率,并进行定期优化。

  • 读书人网 >网络基础

    热点推荐