2013-04-30 49 views
0

太長查詢我有這個MySQL查詢問題:超過1子查詢

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

將指數的主鍵列在性能和快速檢索的使用tables.Indexes幫助。 – MahaSwetha 2013-04-30 06:26:53

+0

@Dai thx編輯我的問題...... – Fikrizal 2013-04-30 08:46:24

回答

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

+0

謝謝你的回答。你的答案解決了我的問題。現在我的查詢要快得多,在我沒有使用索引之前,現在使用它,結果我知道索引函數是什麼。 – Fikrizal 2013-04-30 06:51:26

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 

對不起壞的格式,給它一個鏡頭,讓我知道。

+0

謝謝你的建議 – Fikrizal 2013-04-30 06:48:18

+0

像這樣加入子查詢應該是更好的性能明智的(儘管索引也是需要的)。不過,我認爲@Kartikya在這裏犯了一個小錯字。在子選擇中,我認爲它應該返回fj.ordId而不是fj.id,並且還要通過fj.ordId而不是fj.id來分組。進一步行AND fj.orgId = o.id應該被刪除。 – Kickstart 2013-04-30 09:04:30