事情是这样的,有一个运维的项目,今天突然收到反馈说是 用户首页的商品数据回显的太慢。但是其他用户就没有问题,于是我就找到这个账号,监控一下服务器跑的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 /* 新品 */