【问题标题】:Is there any difference, performance wise, with these two queries? (Repeating the where clause inside the sub-query) MYSQL这两个查询在性能方面有什么区别吗? (在子查询中重复 where 子句)MYSQL
【发布时间】: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 语句,但我很难解析它告诉我的内容。有没有什么好的资源可以让我学习一些技巧或技术来优化我的查询?

我的选择字段中没有任何聚合函数。那么唯一真正的答案是索引吗?

【问题讨论】:

标签: mysql sql


【解决方案1】:

为什么需要第一个子查询?也许只是

Select  *
    FROM  FaultCode FC
    JOIN  Equipment AS 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';

可能的索引:

FC:  INDEX(code_status, EquipmentID)
E:  INDEX(id_organization, equipment_status, EquipmentID,)

SELECT * 可能是不明智的——它将为您提供所有 4 个表的所有列。 (如果没有进一步的细节,我不能建议任何“覆盖”索引,这似乎适用于 AT。)

使用我的查询版本,您关于重复 WHERE 的问题消失了。使用您的版本,它可能会有所帮助。我认为优化器不够聪明,无法捕捉到你在做什么。

告诉我们EXPLAINs。我们可以帮助一些神秘的东西说什么。 (以及它没有说什么。)

“没有索引会得到最好的结果”——你是说你没有索引吗??!每张桌子都没有PRIMARY KEY? “那么唯一真正的答案是索引?”每次针对非小型表编写查询时,都应该问“表是否有足够的索引来进行该查询?”

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多