2

我有这样的看法:

CREATE VIEW invoicereport
SELECT i.ID, SUM(o.Amount * o.Price) AS Total
FROM invoice i
JOIN `order` o ON i.ID = o.InvoiceID
GROUP BY i.ID

直接运行此查询需要 0.03 秒。但是运行视图需要 2 秒。即使我这样做SELECT * FROM invoicereport WHERE ID=9000仍然需要 2 秒。

所以我将视图重写为:

CREATE VIEW invoicereport
SELECT i.ID, (SELECT SUM(Amount * Price) FROM `order` WHERE InvoiceID=i.ID) AS Total
FROM invoice i

以为子查询只会为 ID 9000 执行。然后当我这样做SELECT * FROM invoicereport WHERE ID=9000时更慢,需要 3 秒才能完成。

还有其他方法可以优化此查询吗?

4

2 回答 2

0

我认为没有必要加入这些表,只需分组order就足够了。(只是我的观点)。像这样:

CREATE VIEW INVOICEREPORT
SELECT O.INVOICEID as ID, SUM(O.AMOUNT * O.PRICE) AS TOTAL
FROM `ORDER` O
GROUP BY O.INVOICEID

然后,您可以与其他人一起加入此视图。并在order.

于 2012-12-08T08:46:22.733 回答
0

我同意 Kuya John 的评论。在这样一个简单的总结中,甚至都不要试图将其作为一个视图来做。它的简单性是不需要进行连接的。几年前我提供了另一个类似的答案,其中有人正在使用现有视图,而他的查询是一些淫秽的时间。当我要求返回查询的原始表并直接编写时,查询仍然非常易于阅读且速度极快。不要使用视图,只需直接选择语句即可。

像子选择这样的视图通常是查询时间的杀手,我总是尽量避免它们。

由于您也在寻找其他发票数据,所以应该没有问题......但更大的确认......您的订单表是否在发票 ID 上有索引?

SELECT 
      I.ID, 
      I.Customer_Name,
      I.Tel,
      SUM(o.Amount * o.Price) AS Total
   FROM 
      invoice I
         JOIN `order` o ON I.ID = O.InvoiceID
   WHERE
      I.ID = 9000
   GROUP BY 
      I.ID
于 2012-12-08T11:27:47.173 回答