【问题标题】:MySQL optimize multiple join queryMySQL优化多连接查询
【发布时间】: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.sessionId123, 11411, 456。可能不是你想要的,不是吗?

标签: mysql sql join select query-optimization


【解决方案1】:

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

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`,'%'))

【讨论】:

  • tbl_student_session 有 ~70000 个条目
【解决方案2】:

低效:开启tc.sessions LIKE 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_”。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多