繁体   English   中英

用左联接和求和来加速mysql查询

[英]Speeding up mysql query with left join and sum

我尝试清理一个编码错误的站点,该站点当前获取所有产品,遍历下摆,然后对每个产品运行查询,以从第二张表中获取库存计数(如果计数大于0的话),如果结果回显页面上的产品。

因此,在清理其他混乱的同时,我进行了一个查询(有3个单独的查询,都执行相同的操作,只是变量不同),并且为了不再需要在页面上运行300个以上的mysql查询,我添加了一个总和,他离开了联接表库存列,这样我就可以访问它以检查它是否超过0。

但是,这似乎比运行数百个独立查询慢3倍。

该服务器不是很好,因此由于MySQL问题在负载下会死掉。 但是,尽管我认为运行较少的查询会浪费执行时间,但可能会导致更多问题。

有没有一种方法可以让另一个表的总和加入列,而这又不会让我失望呢?

查询

这是长查询的示例:

SELECT p.Product_Name, 
       p.Product_Price, 
       sum( i.Current_Stock ) AS Current_Stock 
FROM Products p LEFT JOIN 
                Items i ON p.Product_Name = i.Product_Name 
GROUP BY p.Product_ID 
ORDER BY p.Product_ID DESC

简短查询是:

SELECT * 
FROM Products 
ORDER BY Product_ID DESC

每个产品一次查询第二个查询,以查找Items表的库存:

SELECT * 
FROM Items 
WHERE Product_Name = 'Shirt' 
 AND  Current_Stock > 0

然后,我只是检查查询是否正常工作,或者mysql_numrows返回0,然后跳过或回显产品,这取决于该产品的任何选项是否有库存。

产品表

Product_ID | Product_Name 
-------------------------
1          | Shirt
2          | Trousers
3          | Dress

项目表

Item_ID    | Product_Name | Option | Current_Stock
-----------------------------------------
1          | Shirt        | Small  | 0
2          | Shirt        | Medium | 2
3          | Shirt        | Large  | 1

您的第一个查询从两个表中收集行,以构成所有组合物料的临时表。 然后,您的GROUP BY缩小。 为了避免这种膨胀-放气:

SELECT  p.Product_Name, p.Product_Price, 
      ( SELECT  sum( i.Current_Stock )
            FROM  Items i
            WHERE  p.Product_Name = i.Product_Name 
      ) AS Current_Stock
    FROM  Products p
    ORDER BY  p.Product_ID DESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM