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 操作代替子查询可以显著提高复合查询的效率
浙公网安备 33010602011771号