0

我有两张表 Invoice( Id, Status, VendorId, CustomerId, OrderDate, InvoiceFor, )

发票项( Id, Status, InvoiceId, ProductId, PackageQty, PackagePrice, )

这里 invoice.id=invoiceItem.invoiceId (Foregin key) 和 Id 字段是主键 (big int) 这些表包含 100000(invoice) 和 450000(invoiceItem) 行


现在我必须编写一个查询,它将返回发票分类帐,其中发票 = 55 或 66 并且在某个日期范围内。我还必须返回最后一个拍摄日期,其中包含该特定客户之前拍摄的产品日期。


输出应为 OrderDate、InvoiceId、CustomerId、ProductId、LastTaken、PackageQty、PackagePrice


所以我写了以下查询

SELECT a.*, (
    SELECT MAX(ivv.orderdate)
    FROM invoice AS ivv , invoiceItem AS iiv 
    WHERE ivv.id=iiv.invoiceid
    AND iiv.ProductId=a.ProductId AND ivv.CustomerId=a.CustomerId AND ivv.orderDate<a.orderdate
) AS lastTaken FROM (
    SELECT iv.Id, iv.OrderDate, iv.CustomerId, iv.InvoiceFor, ii.ProductId,     
    ii.PackageQty, ii.PackagePrice
    FROM invoice AS iv, invoiceitem AS ii
    WHERE iv.id=ii.InvoiceId 
    AND iv.InvoiceFor IN (55,66)
    AND iv.Status=0 AND ii.Status=0 
    AND OrderDate BETWEEN '2011-01-01' AND '2011-12-31'
    ORDER BY iv.orderdate, iv.Id ASC 
) AS a

但我总是把时间赶出去。我将如何解决问题???

该查询的解释如下: 在此处输入图像描述

4

2 回答 2

0

关于查询本身的两点:

  1. 学习使用正确的 JOIN 语法。在WHERE从句中进行连接就像用莎士比亚英语写问题一样。
  2. 子查询中的ORDER BY应该在最高级别之外。

然而,这些都不是扼杀性能。问题是SELECT子句中的子查询。我认为问题在于您在SELECT子句中的子查询没有直接加入这两个表。尝试包括iiv.InvoiceId = ivv.InvoiceIdin,优选和ON子句。

如果这不起作用,请尝试索引策略。以下索引应提高该子查询的性能:

  • InvoiceItem(ProductId) 上的索引
  • 发票上的索引 (CustomerId, OrderDate)

这应该允许 MySQL 从索引运行子查询,而不是全表扫描,这应该是一个很大的性能改进。

于 2012-10-07T19:15:01.957 回答
0

Create index on OrderDate and InvoiceFor attributes. It should be much faster.

于 2012-10-07T13:36:14.327 回答