【发布时间】:2012-10-08 18:57:25
【问题描述】:
我有两张桌子
发票(
Id,
Status,
VendorId,
CustomerId,
OrderDate,
InvoiceFor,
)
发票项目(
Id,
Status,
InvoiceId,
ProductId,
PackageQty,
PackagePrice,
)
这里 invoice.id=invoiceItem.invoiceId(外键) 和 Id 字段是主键(大整数) 这些表包含 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
但我总是超时。我将如何解决这个问题???
这个查询的解释如下:
【问题讨论】:
-
这些表存在哪些索引?
-
Id 是两个表的主键
-
InvoiceItem.InvoiceId 是否已编入索引?这在几乎任何情况下都会有所帮助。
-
是invoiceitem表的invoiceid是包含invoice表id值的foregin key
-
我相信MySQL默认为外键创建索引。
标签: mysql optimization query-optimization