MySQL左连接两个嵌套的性能表

MySQL左连接两个嵌套的性能表,mysql,performance,nested,Mysql,Performance,Nested,我的查询与此类似,此代码有效,但存在性能问题: SELECT Mat.Name, Inc.Quantity, Outg.Quantity FROM Materials AS Mat LEFT JOIN ( SELECT MaterialsID, SUM(Quantity) AS Quantity FROM Incoming GROUP BY MaterialsID ) AS Inc ON Inc.MaterialsID=Mat.ID LEFT JOIN ( SELECT MaterialsID,

我的查询与此类似,此代码有效,但存在性能问题:

SELECT Mat.Name, Inc.Quantity, Outg.Quantity FROM Materials AS Mat
LEFT JOIN ( SELECT MaterialsID, SUM(Quantity) AS Quantity FROM Incoming GROUP BY MaterialsID ) AS Inc
ON Inc.MaterialsID=Mat.ID
LEFT JOIN ( SELECT MaterialsID, SUM(Quantity) AS Quantity FROM Outgoing GROUP BY MaterialsID ) AS Outg
ON Outg.MaterialsID=Mat.ID
ORDER BY Mat.ID ASC
LIMIT 10
无论LIMIT(或WHERE子句)选择1、10或1000行,执行时间都是相同的(在我的例子中,如果不缓存,则执行时间为4秒)。
在保持代码可读性的同时,是否有好的方法来优化此查询?

出现的情况是,您有一对子查询(可能不快),然后将结果与Materials表合并,然后丢弃除前10个ID以外的所有ID。如果材质上有大量记录,则在删除大多数记录之前,这是一个大而慢的连接(子查询不会传回要在连接中使用的索引)

虽然我通常对它们不感兴趣,但此时可能需要在SELECT中使用子查询(关联子查询)。这意味着它将只计算您关心的10条记录的数量

SELECT Mat.Name, 
        ( SELECT SUM(Quantity) FROM Incoming WHERE MaterialsID=Mat.ID ) Inc_Quantity, 
        ( SELECT SUM(Quantity) FROM Outgoing WHERE MaterialsID=Mat.ID ) Out_Quantity
FROM Materials AS Mat
ORDER BY Mat.ID ASC

限制10

答案很好,我很高兴我问了这个问题。我已经发现的唯一问题是,我可以忘记尝试按这些字段排序。这很可能无法通过优化查询来解决。这样做,您就无法有效地对这些字段进行排序。但是如果你想对其中一个进行排序,你可以把它放在主查询中(并且假设你对那些和为空的查询不感兴趣,那么你可以只使用一个内部连接而不使用子查询),然后对第二个查询(你不排序的查询)使用相关子查询,按field MaterialsID输入和输出的索引表也将极大地提高性能?我现在不太熟悉wit索引,所以我将在数据库进一步增长时使用它。是的,这将极大地帮助子查询(对不起,我假设您已经有了这样的索引),但这些索引不会从子查询执行到原始查询中的外部选择。