2014-03-03 93 views
0

爲什麼我的查詢需要大約2分鐘的時間來處理?查詢加入緩慢

我需要從8表中取屬性。

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

爲什麼我要加入這些表的原因是bacause我從用戶輸入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 |表| |鍵入| possible_keys |鍵| key_len | ref |行| Extra

1 | SIMPLE | g | ALL | NULL | NULL | NULL | NULL | 6049 |使用臨時; 使用文件排序

1 | SIMPLE | h | ALL | NULL | NULL | NULL | NULL | 6055 |使用where |

1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 257 | educate_aeu2.g.sem_id 1

1 | SIMPLE | b | eq_ref | PRIMARY | PRIMARY | 257 | educate_aeu2.h.student_id 1使用其中

1 | SIMPLE | f | eq_ref | PRIMARY | PRIMARY | 257 | educate_aeu2.b.intake_id 1

1 | SIMPLE | e | eq_ref | PRIMARY | PRIMARY | 257 | educate_aeu2.b.program_id 1

1 | SIMPLE |我| eq_ref | PRIMARY | PRIMARY | 257 | educate_aeu2.b.learningCenter_id 1

1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 17077 |使用位置

1 | SIMPLE | d | eq_ref | PRIMARY | PRIMARY | 257 | educate_aeu2.a.sub_id 1

+2

通過對查詢執行EXPLAIN並查看哪些索引正在被使用 –

+4

使用索引的適當字段... – user1844933

+0

MySQL可以''EXPLAIN'和'解釋擴展'您的查詢比我們能夠更好,因爲MySQL已經知道模式的外觀如何 –

回答

0

您retreiving很多領域在內部選擇,做一個排序,然後無視大多數這些領域的,做是另一排序。這會浪費時間

快速清理代碼得到: -

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的輸出),我們將努力提供任何有用的幫助。

+0

我有我的解釋表更新 – user3269893

+0

看看解釋似乎有幾個問題。首先在admin_sem_wise_cgpa和admin_sem_wise_gpa上,您需要將使用的索引(可能是student_id和sem_id上的覆蓋索引)。另外,大多數鍵的長度似乎爲257,這表明id字段存儲在VARCHAR(255)字段中,這可能比使用INT主鍵慢得多。 – Kickstart

+0

如何爲他們創建索引?我是否需要加入該查詢?或者在該查詢中調用索引? – user3269893