【发布时间】:2019-02-20 09:07:51
【问题描述】:
在 MySQL 中,我有两个表之间的简单连接。像
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;
身份证 选择类型 桌子 分区 类型 可能的键 钥匙 key_len 参考 行 过滤 额外的
1 基本的 (空值) 参考 4 常量 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;
身份证 选择类型 桌子 分区 类型 可能的键 钥匙 key_len 参考 行 过滤 额外的
1 简单的 r (空值) 常量 基本的 基本的 4 常量 1 100.00 使用索引
1 简单的 s (空值) 参考 idx_tbl_deliverroute_sku_drid idx_tbl_deliverroute_sku_drid 4 常量 22 100.00 (空)
【问题讨论】:
-
请检查两个查询的执行计划,方法是在每个查询前面加上
EXPLAIN。请注意,对于前者,MySQL 可能先进行 filtering 然后 grouping,而对于后者,反之亦然,这可以解释问题。 (如果是这种情况,您可以改用存储过程。) -
感谢您的回复。这些陈述中的每一个的计划都是不同的。此外,我们最近设置了生产环境的暂存环境。这种观点被广泛使用。迁移到存储过程意味着很多工作
-
同样的视图在生产环境中运行良好。仅在暂存环境中会遇到视图问题。
-
发布
EXPLAIN EXTENDED查询结果(可能会审查敏感信息)会有所帮助。此外,可能值得检查暂存环境和生产环境的两种模式是否相同,尤其是 KEY / INDEX 部分。 -
我建议您编辑您的问题并将结果放在那里(以及您在 cmets 中详细说明的所有其他内容)。提前致谢。