0

我对这个 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 秒内加快数据检索速度?

嗯,你的评论对我很有帮助。

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

谢谢你

4

2 回答 2

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

抱歉格式错误,试一试,让我知道。

于 2013-04-30T06:35:29.740 回答
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

底线:不要从索引shutgun操作开始。您应该只在那些用于连接和许多 where 语句的列上放置索引。否则你会再次降低性能。一个好的起点是

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

于 2013-04-30T06:36:28.403 回答