MySQL-保存视图时查询缓慢

时间:2018-09-16 03:59:51

标签: mysql sql

在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 (空)

2 个答案:

答案 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中的子查询具有相同的效果,因此不起作用。

我不知道使用视图的解决方案。您可以避免为此使用视图。最终的解决方案是实现一个触发器,以将汇总结果存储在另一个表中-有效地实现视图。