在MySQL中,我在2个表之间进行了简单的连接。
select a.id, SUM(b.qty) from a inner join b on a.id=b.id
where a.id=12345
group by a.id
它作为查询正常运行。但是当我保留查询
select a.id, SUM(b.qty) from a inner join b on a.id=b.id
group by a.id
在名为view_ab
的视图中,当我在视图上运行以下查询时,该视图会花费大量时间。
select * from view_ab where id = 12345
这两个表都是大表。无法找出造成这种性能下降的原因。请帮助解决此性能问题
编辑: 这是视图SQL
CREATE VIEW view_ab AS SELECT
r.drid AS drid,
SUM(s.return_qty) AS return_qty
FROM tbl_deliveryroute r INNER JOIN tbl_deliveryroute_sku s ON r.drid =
s.drid GROUP BY r.drid;
这是查询
SELECT
r.drid AS drid,
SUM(s.return_qty) AS return_qty
FROM tbl_deliveryroute r INNER JOIN tbl_deliveryroute_sku s ON r.drid =
s.drid WHERE r.drid=12718651
GROUP BY r.drid;
这是对VIEW的查询
SELECT * FROM view_ab WHERE drid=12718651;
视图的执行计划
EXPLAIN EXTENDED SELECT * FROM view_ab WHERE drid=12718651;
id select_type 表 隔断 类型 可能的钥匙 键 key_len 参考 行数 已过滤 额外
1 主 (空值) 参考 4 const 10 100.00 (空)
2 派生 s (空值) 所有 idx_tbl_deliverroute_sku_drid (空值) (空值) (空值) 15060913 100.00 使用临时使用文件排序
2 派生 [R (空值) eq_ref PRIMARY,FK_tbl_deliveryroute_1 主 4 humdemotest.s.drid 1个 100.00 使用索引
EXPLAIN EXTENDED SELECT
r.drid AS drid,
SUM(s.return_qty) AS return_qty
FROM tbl_deliveryroute r INNER JOIN tbl_deliveryroute_sku s ON r.drid =
s.drid WHERE r.drid=12718651
GROUP BY r.drid;
id select_type 表 隔断 类型 可能的钥匙 键 key_len 参考 行数 已过滤 额外
1 简单 [R (空值) const 主 主 4 const 1个 100.00 使用索引
1 简单 s (空值) 参考 idx_tbl_deliverroute_sku_drid idx_tbl_deliverroute_sku_drid 4 const 22 100.00 (空)
答案 0 :(得分:0)
从我所看到的,您甚至不需要连接,因为您正在处理A-B相同键列上的连接,该键已存在于表B中,只需按此查询组即可。另外,我会在您的DeliveryRoute_SKU的路由ID列上建立一个索引
SELECT
s.drid,
sum( s.return_qty ) Return_Qty
from
tbl_DeliveryRoute_Sku s
where
s.drID = 12718651
group by
s.drID;
由于只执行键和和,所以您甚至不需要其他表。现在,如果您需要除键之外的第一个表中的其他列,那么是的,您将需要联接。您甚至可以进一步简化步骤,因为您只查询单个键ID
SELECT
sum( s.return_qty ) Return_Qty
from
tbl_DeliveryRoute_Sku s
where
s.drID = 12718651;
答案 1 :(得分:0)
查看缓慢的原因很简单。您正在执行:
SELECT *
FROM view_ab
WHERE drid = 12718651;
您要执行的是:
select a.id, SUM(b.qty)
from a inner join
b
on a.id = b.id
where a.id = 12345
group by a.id;
实际执行的是:
select ab.*
from (select a.id, SUM(b.qty)
from a inner join
b
on a.id = b.id
group by a.id
) ab
where ab.id = 12345;
也就是说,首先执行整个聚合。 然后应用where
。您想要的是将谓词推高(MySQL称为此合并)。您可以查看与此主题相关的https://stackoverflow.com/a/51751393/8070090。
一种解决方案似乎是将查询重新表述为相关子查询:
select a.id,
(select sum(b.qty) from b where b.id = a.id) as qty
from a
where a.id = 12345;
A,select
中的子查询具有相同的效果,因此不起作用。
我不知道使用视图的解决方案。您可以避免为此使用视图。最终的解决方案是实现一个触发器,以将汇总结果存储在另一个表中-有效地实现视图。