【发布时间】:2020-01-02 09:38:29
【问题描述】:
我有这个永远运行的查询,它已经在 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 等
更新
我将限制设置为 10 行,这是执行计划:
【问题讨论】:
-
任何查询优化问题都需要
EXPLAIN ..语句的结果才能进行查询。此外,您查询中的LIKE %%绝对不能使用任何索引。 -
30 分钟? db 有多大?
-
还有明确的证据表明您在单个字段 (
tc.sessions) 中使用逗号分隔值,而不是拥有每行具有一个 ID 的实际关系表。在您修复数据库设计错误之前,这永远不会很快。 -
抱歉,没有办法优化查询,除非表的设计方式可以使用索引进行连接查找。您对非规范化设计的坚持是导致性能不佳的原因。
-
也可能导致错误的结果。想象一下您的
tc.sessions值是11,而tsts.sessionId是123, 11411, 456。可能不是你想要的,不是吗?
标签: mysql sql join select query-optimization