我的看法是:
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 秒。
但是运行 View 需要 2 秒。即使当我执行 SELECT * FROM invoicereport WHERE ID=9000
时,它仍然需要 2 秒。
所以我将 View 重写为:
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 秒才能完成。
还有其他方法可以优化这个查询吗?
最佳答案
我觉得这些表没有必要join,只要order
分组就可以了。 (只是我的观点)。像这样:
CREATE VIEW INVOICEREPORT
SELECT O.INVOICEID as ID, SUM(O.AMOUNT * O.PRICE) AS TOTAL
FROM `ORDER` O
GROUP BY O.INVOICEID
然后你就可以和其他人一起加入这个 View 了。并在 order
上使用索引。
关于mysql - 使用聚合函数优化 MySQL View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13775806/