背景
今天遇到一个项目页面加载慢得问题,经过定位发现是sql查询慢,一个列表查询sql大约需要2980ms,倒是页面加载需要3秒多。
问题sql描述
表A是书本表book ,表B是书本浏览记录表 book_log表。
功能需求
查询出book列表,然后查询出book得浏览总数,展示在列表;
需要查出: 主键id,书名, 该书得浏览次数;
慢sql
SELECT
id,
NAME,
(
SELECT
count(1)
FROM
book_log b
WHERE
id = b.book_id
) callNumExt
FROM
book
问题定位分析
book_log 表有10万条数据,导致整个sql查询慢。优化思路就是left jion支持关联子查询,我先把 book_log 表得数据查询出来,在进行关联查询。
优化后sql
- 先将book_log 表根据book_id 进行分组查询, 进行统计每本书的浏览数量。
- 然后再关联再book中,进行关联查询。
- 优化后大概是 560ms左右,提速三倍。
SELECT
DISTINCT c.id,c.`name`,b.callNumExt
FROM
book c
LEFT JOIN
(SELECT COUNT(*) as callNumExt, book_id
FROM book_log GROUP BY book_id) b
ON c.id = b.book_id
注: 这里得sql未验证可能有问题,主要是思路本身,理解了根据自己得业务场景进行参考,主要是应用了left jion 关联子查询进行优化的