【发布时间】:2011-10-20 23:23:58
【问题描述】:
这是我的查询:
SELECT B.RECORDID, A.ITEMCODE, A.ITEMNAME, A.STOCKINHAND, B.SALEPRICE
FROM ITEMMASTER A, STOCKENTRY B
WHERE A.ITEMID = B.ITEMID
AND RECORDID = (SELECT MAX(RECORDID) FROM STOCKENTRY
WHERE ITEMID = A.ITEMID)
AND A.STOCKINHAND > 0
AND B.SALEPRICE > 0
AND B.INVOICEDATE IS NOT NULL
ORDER BY A.ITEMNAME, B.INVOICEDATE;
表 B (StockEntry) 可能包含一条或多条记录,而表 A (ItemMaster) 肯定只有一行对应于该 ItemID。
如果我删除 WHERE 子句中的子查询,它会显示一行或多行。我觉得通过 WHERE 子句中的子查询选择 max(RecordID) 会减慢查询速度。我在 RecordID、InvoiceDate、ItemID 上确实有索引,但 MySQL 日志仍然显示此查询执行不佳。由于某种原因,我无法更改列顺序。
有没有更好的方法来优化这个查询?
【问题讨论】:
-
不确定
MySQL中的索引是否类似于SQL Server,但对于SQL Server,我会在Stockentry 上为ItemID, RecordID添加一个覆盖索引,这应该会大大加快子选择的速度。 -
@marc - 他在最后一段的旁边提到了
MySQL -
您有当前查询的平均时间吗?
-
@ace:这是我在 dba.stackexchange.com 上发布查询日志的问题的链接:dba.stackexchange.com/questions/4358/…
标签: mysql sql greatest-n-per-group query-performance