在 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
的 View 中,当我在 View 上运行以下查询时,该 View 会花费大量时间。
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;
View 的执行计划
EXPLAIN EXTENDED SELECT * FROM view_ab WHERE drid=12718651;
编号 选择类型 table 分区 类型 可能的键 key key 长度 引用 行 过滤 额外的
1 基本的 (无效的) 引用 4个 常数 10 100.00 (空)
2 衍生的 秒 (无效的) 全部 idx_tbl_deliverroute_sku_drid (无效的) (无效的) (无效的) 15060913 100.00 使用临时;使用文件排序
2 衍生的 r (无效的) eq_ref 主要,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;
编号 选择类型 table 分区 类型 可能的键 key key 长度 引用 行 过滤 额外的
1 简单的 r (无效的) 常数 基本的 基本的 4个 常数 1个 100.00 使用索引
1 简单的 秒 (无效的) 引用 idx_tbl_deliverroute_sku_drid idx_tbl_deliverroute_sku_drid 4个 常数 22 100.00 (空)
最佳答案
据我所知,您甚至不需要连接,因为您正在处理来自 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;
因为你只做键和求和,你甚至不需要另一个表。现在,如果您需要第一个表中除键之外的其他列,那么是的,您需要连接。您甚至可以进一步简化步骤,因为您只查询一个 key ID
SELECT
sum( s.return_qty ) Return_Qty
from
tbl_DeliveryRoute_Sku s
where
s.drID = 12718651;
关于MySQL - 保持 View 时查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52350836/