mysql 子查询优化

问题:

mysql 对子查询的优化好像做的不好,比如最近在项目中用到一条查询语句:

SELECT a.object_id,a.object_content FROM NEWS_PERSON_OBJECT a WHERE object_id in ( SELECT object_id FROM IMPORTANT_OBJECT_REL  where object_type = 0 AND important_id=4);

非常的耗时。 然而

SELECT object_id FROM IMPORTANT_OBJECT_REL  where object_type = 0 AND important_id=4

速度很快而且返回的结果只有两行1和27。

SELECT a.object_id,a.object_content FROM NEWS_PERSON_OBJECT a WHERE object_id in(1, 27);

也很快。

为什么写成子查询就会很慢呢?

 

实验:

执行

DESC SELECT a.object_id,a.object_content FROM NEWS_PERSON_OBJECT a WHERE object_id IN ( SELECT object_id FROM IMPORTANT_OBJECT_REL  WHERE object_type = 0 AND important_id=4);

可以发现查询  NEWS_PERSON_OBJECT 表时还是扫描了全部的表,这明显是不合理的。

 

如果把这条子查询写成 join 的形式,然后DESC一下:

DESC SELECT a.object_id,a.object_content FROM NEWS_PERSON_OBJECT a INNER JOIN IMPORTANT_OBJECT_REL b ON a.object_id = b.object_id WHERE b.object_type = 0 AND b.important_id=4

会发现只会查询 NEWS_PERSON_OBJECT 表的两行。速度很快。

 

结论:

 

使用 join 操作代替子查询可以显著提高复合查询的效率

 

 

posted on 2013-05-28 17:01  王维_ICT  阅读(328)  评论(0)    收藏  举报

导航