Mysql for SQl优化 (Handler_read_next 内容过大)

本文讲述了运维项目中遇到用户首页商品数据加载缓慢问题,通过SQL性能分析发现子查询是瓶颈。作者通过实例展示了如何从用户订单量大的角度定位问题,并成功通过链接查询优化,显著提高了查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事情是这样的,有一个运维的项目,今天突然收到反馈说是 用户首页的商品数据回显的太慢。但是其他用户就没有问题,于是我就找到这个账号,监控一下服务器跑的sql,抓取出这个sql的入参,用navicat测试库跑一下,发现sql执行时间特别久。
在这里插入图片描述
紧接着我又找了一个正常的账号试了一下,发现入参除了user_id 不同之外,其他没有出入。于是分别执行了不用user_id 的执行计划,结果发现,打印出来的是相同的。
在这里插入图片描述
这里附一下sql

 explain
SELECT
	m.unit_item_id unitItemId,
	m.name1 /* 商品名称 */
	,
	min( ip.price ) price,
	m.img_url imgUrl /* 商品图片 */
	,
	sum( i.available_qty ) availableQty /* 可下单数 */
	,
	(
	SELECT
		sum( l.qty ) qty 
	FROM
		vcu_order_line l
		JOIN vcu_order_head h ON l.order_id = h.order_id 
	WHERE
		h.type = 1 
		AND h.STATUS > 0 
		AND l.unit_item_id = m.unit_item_id 
		AND h.user_id = 18243 
	GROUP BY
		l.unit_item_id 
	) orderedQty /* 申领量 */
	,
	w.`name` whName 
FROM
	vcu_unit_item_master m
	INNER JOIN vcu_item_price ip ON ip.item_id = m.unit_item_id 
	AND ip.type = 3
	LEFT JOIN vcu_unit_sku_master s ON m.unit_item_id = s.unit_item_id
	INNER JOIN vcu_inventory i ON i.sku_id = s.unit_sku_id 
	AND i.available_qty != 0 
	AND i.wh_id IN ( 119 )
	LEFT JOIN vcu_wharehouse w ON i.wh_id = w.wh_id 
WHERE
	1 = 1 
	AND m.STATUS = 1 
GROUP BY
	m.unit_item_id,
	m.name1,
	m.img_url,
	s.unit_sku_id 
ORDER BY
	m.unit_item_id DESC /* 新品 */

就怀疑是子查询的问题,于是就通过user_id 去对应的订单表去查询对应的订单。就发现查询比较慢的那个用户的订单量很大。就明白了。是这个子查询影响。然后做了一下修改,如下。
将原来的子查询改成 链接查询 速度就会快特别多。 正常查询出来的结果集是175条,也就是说,子查询也就执行175遍,这样就导致了查询的慢。

-- explain
 SELECT
	m.unit_item_id unitItemId,
	m.name1 /* 商品名称 */
	,
	min( ip.price ) price,
	m.img_url imgUrl /* 商品图片 */
	,
	sum( i.available_qty ) availableQty /* 可下单数 */
	,
	t_req.qty orderedQty /* 申领量 */
	,
	w.`name` whName 
FROM
	vcu_unit_item_master m
	INNER JOIN vcu_item_price ip ON ip.item_id = m.unit_item_id 
	AND ip.type = 3
	LEFT JOIN vcu_unit_sku_master s ON m.unit_item_id = s.unit_item_id
	INNER JOIN vcu_inventory i ON i.sku_id = s.unit_sku_id 
	AND i.available_qty != 0 
	AND i.wh_id in(119)
	LEFT JOIN vcu_wharehouse w ON i.wh_id = w.wh_id 
	LEFT JOIN (
			SELECT
				l.unit_item_id,sum(l.qty) qty
			FROM
				vcu_order_line l
				JOIN vcu_order_head h ON l.order_id = h.order_id 
			WHERE
				h.type = 1 
					and h.status > 0
				AND h.user_id = 18243 
			GROUP BY l.unit_item_id
		) t_req on t_req.unit_item_id = m.unit_item_id
WHERE
	1 = 1 
	AND m.STATUS = 1 
GROUP BY
	m.unit_item_id,
	m.name1,
	m.img_url,
	s.unit_sku_id 
ORDER BY
	m.unit_item_id DESC /* 新品 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值