【发布时间】:2022-01-15 12:26:50
【问题描述】:
我有一个类似这样的查询。
Select *
FROM FaultCode FC
JOIN (
SELECT INNER_E.* FROM Equipment INNER_E
) E USING(EquipmentID)
LEFT JOIN AssetType AT ON AT.id_asset_type = E.id_asset_type AND AT.id_language = 'en-us'
LEFT JOIN Project P ON E.current_id_project = P.id_project
WHERE E.id_organization = 100057 AND E.equipment_status = 'ACTIVE'
AND FC.code_status = 'OPEN'
如您所见,在外部查询中,外部主查询中有一个 where 子句。
而且,在内部,我们有一个带有SELECT INNER_E.* FROM Equipment INNER_E 行的Inner Join 语句。这个内连接使我们只检索设备表内的故障代码(如果我错了,请纠正我)。
我正在尝试优化此查询。
我的问题是,这样做有什么不同
Select *
FROM FaultCode FC
JOIN (
SELECT INNER_E.* FROM Equipment INNER_E
WHERE INNER_E.id_organization = 100057 AND INNER_E.equipment_status = 'ACTIVE'
) E USING(EquipmentID)
LEFT JOIN AssetType AT ON AT.id_asset_type = E.id_asset_type AND AT.id_language = 'en-us'
LEFT JOIN Project P ON E.current_id_project = P.id_project
WHERE E.id_organization = 100057 AND E.equipment_status = 'ACTIVE'
AND FC.code_status = 'OPEN'
所以在内部子查询中重复 where 子句,在它加入之前进一步限制它。或者优化器是否知道自动执行此操作?
我尝试在代码中实现该行,但它似乎只会让我的查询变慢,奇怪的是。有什么办法可以优化上面的查询,或者因为它很简单,所以没有索引是最好的吗?
我尝试运行 Explain Select 语句,但我很难解析它告诉我的内容。有没有什么好的资源可以让我学习一些技巧或技术来优化我的查询?
我的选择字段中没有任何聚合函数。那么唯一真正的答案是索引吗?
【问题讨论】:
-
您可能希望将内部查询移至 WITH 子句,看看是否有帮助。 stackoverflow.com/questions/1382573/…