我有这个观点:
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秒才能完成。
还有其他方法可以优化此查询吗?
答案 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