簡體   English   中英

用JOIN查詢慢

[英]Query with JOIN slow

為什么我的查詢需要大約2分鍾的時間來處理?

我需要從8表中獲取屬性。

我該如何加入這些表格並使其成為快速查詢?

我之所以要加入這些表的原因是因為我想從用戶輸入的progCode中獲取fetchAll(PDO :: FETCH_ASSOC)

這是我的查詢:

"SELECT DISTINCT a.`ProgCode`, a.`Program` 
   FROM (select `i`.`name` AS `LC`,`f`.`name` AS `Intake`,`a`.`student_id` 
   AS `student_id`,`b`.`matricNo` 
   AS `matricNo`,`b`.`name` 
   AS `Nama`,`a`.`sem_id` 
   AS `sem_id`,`c`.`name` 
   AS `Sessi`,`e`.`code` 
   AS `ProgCode`,`e`.`name` 
   AS `Program`,`a`.`sub_id` 
   AS `sub_id`,`d`.`code` 
   AS `SubCode`,`d`.`name` 
   AS `Subject`,`a`.`grade` 
   AS `grade`,`h`.`credit` 
   AS `CurrentCreditHour`,`g`.`totalcredit` 
   AS `TotalCreditHour`,`g`.`gpa` 
   AS `GPA`,`g`.`cgpa` 
   AS `CGPA` from ((((((((`admin_sub_mark` `a` join `enrl_student` `b`) 
     join `struc_session` `c`) 
     join `struc_session` `f`) 
     join `struc_subject` `d`) 
     join `struc_program` `e`) 
     join `admin_sem_wise_cgpa` `g`) 
     join `admin_sem_wise_gpa` `h`) 
     join `struc_learningcentre` `i`) 
  where ((`b`.`id` = `a`.`student_id`) 
  and (`d`.`id` = `a`.`sub_id`) 
  and (`c`.`id` = `a`.`sem_id`) 
  and (`e`.`id` = `b`.`program_id`) 
  and (`f`.`id` = `b`.`intake_id`) 
  and (`i`.`id` = `b`.`learningCenter_id`) 
  and (`a`.`student_id` = `g`.`student_id`) 
  and (`a`.`sem_id` = `g`.`sem_id`) 
  and (`h`.`student_id` = `g`.`student_id`) 
  and (`h`.`sem_id` = `g`.`sem_id`)) order by `b`.`name`) a  
  ORDER BY `Program` ASC"

這是我的解釋查詢:

id | select_type | 桌子| 類型 可能的鑰匙| 關鍵 key_len | 參考| 行| 額外

1 | 簡單 g | 全部| NULL | NULL | NULL | NULL | 6049 | 使用臨時; 使用文件排序

1 | 簡單 h | 全部| NULL | NULL | NULL | NULL | 6055 | 在哪里使用

1 | 簡單 c | eq_ref | 主要| 主要| 257 | educate_aeu2.g.sem_id 1

1 | 簡單 b | eq_ref | 主要| 主要| 257 | educate_aeu2.h.student_id 1在何處使用

1 | 簡單 f | eq_ref |主要| 主要| 257 | educate_aeu2.b.intake_id 1

1 | 簡單 e | eq_ref | 主要| 主要| 257 | educate_aeu2.b.program_id 1

1 | 簡單 eq_ref | 主要| 主要| 257 | educate_aeu2.b.learningCenter_id 1

1 | 簡單 |全部| NULL | NULL | NULL | NULL | 17077 | 在哪里使用

1 | 簡單 d | eq_ref | 主要| 主要| 257 | educate_aeu2.a.sub_id 1

您將在內部select中檢索很多字段並進行排序,然后忽略其中的大多數字段並進行另一種排序。 這會浪費時間

快速清理代碼將給出:-

SELECT DISTINCT 
   e.code AS ProgCode,
   e.name AS Program
FROM admin_sub_mark a 
JOIN enrl_student b ON b.id = a.student_id
JOIN struc_session c ON c.id = a.sem_id
JOIN struc_session f ON f.id = b.intake_id
JOIN struc_subject d ON d.id = a.sub_id
JOIN struc_program e ON e.id = b.program_id
JOIN admin_sem_wise_cgpa g ON a.student_id = g.student_id AND a.sem_id = g.sem_id
JOIN admin_sem_wise_gpa h ON h.student_id = g.student_id AND h.sem_id = g.sem_id
JOIN struc_learningcentre i ON i.id = b.learningCenter_id
ORDER BY e.name ASC

不確定是否需要訪問所有表。

此外,您在表上有哪些索引? 如果這樣的查詢運行緩慢,那么罪魁禍首通常是索引,但是在不知道它們是什么(或者更好的是EXPLAIN的輸出)的情況​​下,我們將很難提供任何有用的幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM