提高MySQL中子查询的性能

时间:2013-03-25 20:39:16

标签: mysql performance subquery

这是我的查询,它使用两个子查询和临时表:

select visit.pid, visit.pidvnum, visit.hpv16, visit.qc_hst
FROM visit,
    (select distinct x.pid  from
        (select pid from visit where visit.qc_hst = 1) x,
        (select pid from visit where visit.hpv16 = 1) y
    where x.pid = y.pid) as subtbl
where visit.pid = subtbl.pid
AND (visit.qc_hst = 1 OR visit.hpv16 =1);

有没有办法重写此查询以消除一个或两个子查询?我也使用了具有相同两个子查询的IN子句,但情况更糟。我无法索引像qc_hst和hpv16这样的字段,因为它们有很多,而且其中任何一个都可能是查询的一部分。

这是一个sqlfiddle链接:http://sqlfiddle.com/#!2/68bd6/6/0

非常感谢 - 我真的在这个墙上碰到了我的头......

1 个答案:

答案 0 :(得分:1)

您的查询似乎正在查找pid同时满足这些条件的记录。以下是另一种方法:

select v.pid, v.pidvnum, v.hpv16, v.qc_hst
from visit v join
     (select v.pid
      from visit v
      where visit.qc_hst = 1 or visit.hpv16 = 1
      group by pid
      having SUM(v.qc_hst = 1) > 0 and sum(v.hpv16 = 1) > 0
     ) vp
     on v.pid = vp.pid
where visit.qc_hst = 1 or visit.hpv16 = 1

visit(pid)上的索引可能会帮助任何查询运行得更快。