我有一个可以永久运行的查询,它已经在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_courses
。sessions
包含以下格式的会话:session1,session2,...,sessionn等
UPDATE
我将限制设置为10行,这是执行计划:
答案 0 :(得分:1)
低效率:打开tc
。sessions
就像CONCAT('%',tsts
。sessionId
,'%')。您是否正在尝试将数组放入单元格?别。而是在另一个表中添加行。
但是,假设您当前使用的结构,以下是一些有助于提高性能的索引:
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`,'%'))