我的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秒内加速数据检索?
你的评论对我很有帮助。
如果需要数据,我会发送数据库。
谢谢
答案 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_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