查询超过1个子查询太长

时间:2013-04-30 06:21:47

标签: mysql

我的mysql查询有问题:

SELECT
    CONCAT('Kantor ', o.nama) AS nama,
    IF( sj.jenis = 1, CONCAT(sj.sebutan, ' ' , sj.nama), sj.nama) AS sebutan, 
    (
        SELECT
            COUNT(fj.id)
        FROM
            tbl_formasijabatan fj
        WHERE
            fj.sebutanId = sj.id AND
            fj.status    = 1     AND
            fj.orgId     = o.id
    ) AS total

 FROM
     tbl_organisasi o
     RIGHT JOIN tbl_formasijabatan fjj ON fjj.orgId = o.id
     RIGHT JOIN tbl_sebutanjabatan sj  ON sj.id     = fjj.sebutanId
 WHERE
     o.id = 1 AND
     o.unitKerja > 0
 GROUP BY
     o.nama,
     sj.nama

此查询非常长,只需66秒即可获得330行。

如何至少在1-10秒内加速数据检索?

你的评论对我很有帮助。

如果需要数据,我会发送数据库。

谢谢

2 个答案:

答案 0 :(得分:1)

也许你可以将那个SUBQUERY移动到一个连接,这应该可以让你提高性能,尝试类似:


SELECT CONCAT('Kantor ', o.nama) AS nama, if(sj.jenis = 1, CONCAT(sj.sebutan, ' ', sj.nama), sj.nama) AS sebutan, X.total 
FROM tbl_organisasi o 
RIGHT JOIN tbl_formasijabatan fjj ON fjj.orgId = o.id 
RIGHT JOIN tbl_sebutanjabatan sj ON sj.id = fjj.sebutanId 
JOIN (SELECT COUNT(fj.id) total, fj.id 
    FROM tbl_formasijabatan fj 
    WHERE fj.sebutanId = sj.id 
    AND fj.status = 1 
    AND fj.orgId = o.id 
    GROUP BY fj.id) X 
ON X.id = fjj.id 
WHERE o.id = 1 AND o.unitKerja > 0 
GROUP BY o.nama , sj.nama

抱歉格式不正确,试一试并告诉我。

答案 1 :(得分:0)

大多数情况下,您只是在where子句和join子句中的列上缺少索引。

你应该在

上加上一个索引
  • tbl_formasijabatan.orgId
  • tbl_formasijabatan.sebutanId
  • tbl_organisasi.unitKerja

    alter table `tbl_formasijabatan` add index(`orgId`);
    alter table `tbl_formasijabatan` add index(`sebutanId`);
    alter table `tbl_organisasi` add index(`unitKerja`);
    

您也可以为索引命名,但这将是最快的方式。之后你的查询应该非常快,因为它并不是那么复杂。实际上该组将消耗最多的时间,因为它需要一个临时表。如果你想深入挖掘这里,你可以看看这里

http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

底线:不要以索引关闭操作开始。您应该只将索引放在那些用于连接和大量where语句的列上。否则会再次降低性能。一个很好的起点是

http://www.percona.com/files/presentations/WEBINAR-tools-and-techniques-for-index-design.pdf