php - 使用 JOIN 查询速度慢

标签 php mysql

为什么我的查询需要大约 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|选择类型 |表|类型 |可能的键 |关键| key_len |引用|行 |额外

1 |简单|克|全部 |空|空|空 |空| 6049 | 6049使用临时的; 使用文件排序

1 |简单|小时 |全部 |空|空|空|空| 6055 | 6055使用位置 |

1 |简单| c | eq_ref |小学 |小学 | 257 | 257 education_aeu2.g.sem_id 1

1 |简单|乙| eq_ref |小学 |小学 | 257 | 257 education_aeu2.h.student_id 1 使用地点

1 |简单| f | eq_ref |主要|小学 | 257 | 257 education_aeu2.b.intake_id 1

1 |简单|电子| eq_ref |小学 |小学 | 257 | 257 education_aeu2.b.program_id 1

1 |简单|我| eq_ref |小学 |小学 | 257 | 257 education_aeu2.b.learningCenter_id 1

1 |简单|一个|全部|空|空|空|空| 17077|使用地点

1 |简单| d | eq_ref |小学 |小学 | 257 | 257 education_aeu2.a.sub_id 1

最佳答案

您正在内部选择中检索许多字段并进行排序,然后忽略其中大部分字段并进行另一种排序。这会浪费时间

快速清理代码可以得到:-

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 的输出),我们将很难提供任何有用的帮助

关于php - 使用 JOIN 查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141899/

相关文章:

php - 发布到两个链接表

php/pdo/mysql - 访问被拒绝

mysql,不同用户访问不同表的权限

php - 使用 mysqli_escape_string 函数出错

mysql - 根据连接条件添加列

php - PostgreSQL PDO 插入数组类型

PHP pg_connect 连接字符串

php - jquery 和 ajax 页面刷新问题

php - CSV 大文件分割以导入 phpMyAdmin

php - UTF-8贯穿始终