计算左连接行的MySQL SELECT查询花费的时间太长

时间:2017-11-29 20:00:43

标签: mysql optimization

有谁知道如何优化此查询?

SELECT planbook.*,
  COUNT(pb_unit_id) AS total_units,
  COUNT(pb_lsn_id) AS total_lessons
FROM planbook
  LEFT JOIN planbook_unit ON pb_unit_pb_id = pb_id
  LEFT JOIN planbook_lesson ON pb_lsn_pb_id = pb_id
WHERE pb_site_id = 1
GROUP BY pb_id

缓慢的部分是获得匹配单位和课程的总数。我在以下字段(和其他字段)上有索引:

  • planbook.pb_id
  • planbook_unit.pb_unit_pb_id
  • planbook_lesson.pb_lsn_pb_id

我唯一的目标是获得匹配单位和课程的总数以及每个计划行的详细信息。

但是,此查询大约需要35秒。我在planbook中有1625条记录,在planbook_unit中有13,693条记录,在planbook_lesson中有122,950条记录。

有什么建议吗?

编辑:解释结果

Explain results

2 个答案:

答案 0 :(得分:1)

查看您的查询

您应该为

添加和索引
table planbook column pb_site_id

最终是

的复合版
table planbook column (pb_site_id, pd_id)

答案 1 :(得分:1)

SELECT  planbook.*,
        ( SELECT COUNT(*) FROM planbook_unit
               WHERE pb_unit_pb_id = planbook.pb_id ) AS total_units,
        ( SELECT COUNT(*) FROM planbook_lesson
               WHERE pb_lsn_pb_id  = planbook.pb_id ) AS total_lessons
    FROM  planbook
    WHERE  pb_site_id = 1

planbook:        INDEX(pb_site_id)
planbook_unit:   INDEX(pb_unit_pb_id)
planbook_lesson: INDEX(pb_lsn_pb_id)