使用聚合函数优化MySQL视图

时间:2012-12-08 08:27:59

标签: mysql optimization view aggregate

我有这个观点:

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秒才能完成。

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

2 个答案:

答案 0 :(得分: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上的索引。

答案 1 :(得分: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