2021-08-24

本文介绍了如何通过SQL优化解决一个页面加载慢的问题。原SQL查询涉及两个表的关联,导致查询时间长达2980ms。通过对book_log表进行预聚合,使用LEFT JOIN子查询优化后的SQL,查询时间降至560ms,显著提升了查询效率。优化思路为避免在大表上执行子查询,改为先统计再关联。
摘要由CSDN通过智能技术生成

慢sql优化,俩表关联查询,查询其中一个表字段在第二个表中关联数据的数量

背景

今天遇到一个项目页面加载慢得问题,经过定位发现是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

  1. 先将book_log 表根据book_id 进行分组查询, 进行统计每本书的浏览数量。
  2. 然后再关联再book中,进行关联查询。
  3. 优化后大概是 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 关联子查询进行优化的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值