在MySQL中对另一个子查询的结果执行子查询?
假设有一个表Product,其列为prod_id、a、b 假设有一个带有w_id、pid、amount列的表仓库 关键是连接这两个表,这样我们就可以得到结果列prod_id,a,b,total,它是pid=prod_id的数量之和 目前我有以下问题:在MySQL中对另一个子查询的结果执行子查询?,mysql,performance,subquery,Mysql,Performance,Subquery,假设有一个表Product,其列为prod_id、a、b 假设有一个带有w_id、pid、amount列的表仓库 关键是连接这两个表,这样我们就可以得到结果列prod_id,a,b,total,它是pid=prod_id的数量之和 目前我有以下问题: SELECT t1.prod_id, a, b, c AS total FROM ( SELECT prod_id, a, b FROM product WHERE ean = "3165142644363" ) t
SELECT
t1.prod_id, a, b, c AS total
FROM
(
SELECT prod_id, a, b
FROM product
WHERE ean = "3165142644363"
) t1
LEFT JOIN
(
SELECT warehouse.pid, SUM(amount) AS c
FROM warehouse
WHERE warehouse.pid IN (SELECT prod_id FROM product WHERE ean = "3165142644363")
GROUP BY warehouse.pid
) t2
ON t2.pid = t1.prod_id
现在您可以看到有两个类似但不完全相同的查询:
SELECT prod_id, a, b FROM product WHERE ean = "3165142644363"
SELECT prod_id FROM product WHERE ean = "3165142644363"
执行这两个查询需要太多时间。有没有办法只执行第一个,然后从该子查询的结果中选择产品id?或者任何其他重写查询的有效方法。创建视图不是一个选项,因为可能有许多查询都使用不同的ean参数。查询为同一个ean返回多行数据我认为您可以删除出现在WHERE之后的子查询。。。在: 可以删除它的原因是t2子查询只包含出现在t1子查询中的pid值。否则,在左连接之后,c的和就是零。左连接已经隐式处理了这样的情况,即product中的记录可能不会连接到t2子查询中的任何内容
也就是说,删除WHERE。。。在子查询中,可能不会提高那么多性能,因为它无论如何都不相关。很可能优化器只需要计算一次并将其缓存到某个地方。最终自己找到了解决方案。比我想象的要容易得多:
SELECT pid, a, b, SUM(amount) AS total
FROM product
LEFT JOIN warehouse USING(pid)
WHERE ean = "3165142644363"
GROUP BY pid
在我的示例中,有列prod_id和pid,但实际上这两个表中都是pid
SELECT pid, a, b,
( SELECT SUM(amount)
FROM wherehouse
WHERE pid = product.prod_id
) AS total
FROM product
WHERE ean = "3165142644363";
带索引:
product: INDEX(ean)
wherehouse: INDEX(pid, amount) -- in this order
您的查询在我的表中执行大约需要20秒。最终,我找到了答案,没有使用join进行澄清:我对同一个表的原始查询花费了大约11秒,因此效率没有提高improved@Alvis在产品表的ean列上有索引吗?有索引。无论如何,我找到了一种简化查询的方法,现在执行起来需要0016秒,请检查我对这个问题的回答。只有当pid是产品表上的主键时,此查询才有效。如果不是,那么您的查询要么不会运行,要么会给出不确定的结果。在任何情况下,+1表示查看简单解决方案。pid是产品表中的主要查询。对不起,我没提
product: INDEX(ean)
wherehouse: INDEX(pid, amount) -- in this order