MySQL优化多联接查询

时间:2019-08-29 06:53:36

标签: mysql sql join select query-optimization

我有一个可以永久运行的查询,它已经在MySQL Workbench中运行了30分钟,并且还在计数……可以对其进行优化吗?

SELECT `p`.`id`, `ev`.`id`
FROM `participants` as `p`
JOIN `tbl_student` as `tst` on `p`.`First Name` = `tst`.`First Name` AND `p`.`Last Name` = `tst`.`Last Name`
JOIN `tbl_student_session` as `tsts` on `tst`.`id` = `tsts`.`studentId`
JOIN `tbl_courses` as `tc` on `tc`.`sessions` LIKE CONCAT('%',`tsts`.`sessionId`,'%') 
JOIN `events` as `ev` on `tc`.`description` = `ev`.`body`

表格:

participants: id, firstname, lastname
tbl_student: id, firstname, lastname 
tbl_student_session: sessionId, studentId
tbl_courses: id, sessions, description
events: id, body

tbl_coursessessions包含以下格式的会话:session1,session2,...,sessionn等

UPDATE

我将限制设置为10行,这是执行计划:

enter image description here

2 个答案:

答案 0 :(得分:1)

低效率:打开tcsessions就像CONCAT('%',tstssessionId,'%')。您是否正在尝试将数组放入单元格?别。而是在另一个表中添加行。

但是,假设您当前使用的结构,以下是一些有助于提高性能的索引:

participants:  INDEX(`Last Name`, `First Name`)
student:  INDEX(`Last Name`, `First Name`)
student_session:  INDEX(studentId)
courses:  INDEX(description)
courses:  INDEX(sessions)
events:  INDEX(body)

(您最终会明白为什么我删除了“ tbl _”。)

答案 1 :(得分:0)

尝试此查询。如果有任何改进。我相信您的会话表非常庞大。

SELECT `p`.`id`, `ev`.`id`
FROM `participants` as `p`
JOIN `tbl_student` as `tst` on `p`.`First Name` = `tst`.`First Name` AND `p`.`Last Name` = `tst`.`Last Name`
JOIN `tbl_student_session` as `tsts` on `tst`.`id` = `tsts`.`studentId`
JOIN `events` as `ev` on `tc`.`description` = `ev`.`body`
where exists (
   select 1 from `tbl_courses`
where `sessions` LIKE CONCAT('%',`tsts`.`sessionId`,'%'))