【问题标题】:MySQL query - better performance with more specificity on JOIN?MySQL 查询 - 更好的性能和更具体的 JOIN?
【发布时间】:2017-03-07 20:12:50
【问题描述】:

我正在编写一个 MySQL 查询,但我有一个疑问:以下哪些代码更快?我认为如果我在“左连接”(第二个代码)中更具体,它应该会更快。这种方法正确吗?

SELECT  m.*, p.nome AS nomeprocedimento
FROM medicos AS m
    LEFT JOIN medicoprocedimento AS mp ON m.id = mp.medicoid
    LEFT JOIN procedimentos AS p ON mp.procedimentoid = p.id
WHERE m.id = 123

SELECT  m.*, p.nome AS nomeprocedimento
FROM medicos AS m
    LEFT JOIN medicoprocedimento AS mp ON m.id = mp.medicoid AND mp.medicoid = 123
    LEFT JOIN procedimentos AS p ON mp.procedimentoid = p.id
WHERE m.id = 123

【问题讨论】:

  • 请提供SHOW CREATE TABLE
  • 你真的需要LEFT吗?您是否希望 p.nome 在某些情况下为 NULL?
  • 这些返回 2 个不同的输入函数,除非某些约束成立,所以争论哪个更快是没有实际意义的。 minimal reproducible example 加上这表明没有研究。 How to Ask help center 同样“更快”取决于你不给的情况。

标签: mysql performance join


【解决方案1】:

如果该字段被索引,它通常并没有太大区别,因为查询优化器会看到您正在寻找来自medicoprocedimento.medicoid(或medicos.id)的单个值) 柱子。因此,它通常通常在此值上进行索引搜索/扫描在它执行连接之前即使您只有在where 子句中的过滤器而不是直接在join

也就是说,在您做出选择之前,您应该始终检查您的执行计划,以验证此优化是否已完成。 运行查询时实际发生了什么

【讨论】:

  • 我很喜欢你的考虑。非常感谢! (对不起我的英语不好)
【解决方案2】:

您可以使用 EXPLAIN 来了解哪个更快,但对于您的示例应该是相同的。

【讨论】:

  • 我尝试了 EXPLAIN (命令),但得到了相同的答案。所以,我提出这个问题来看看一些意见。
  • 如果解释命令显示相同的结果,那么它应该是相同的。
  • 好的,但是今天我的行数不多。我在考虑是否可以在具有大量行的情况下具有不同的性能。
  • 只要EXPLAIN命令中使用的索引相同,性能就相同。随意尝试使用大型数据集,如果我错了,我很高兴知道:)
【解决方案3】:

添加 Slimns 所说的可以简化查询的内容

SELECT  m.*, p.nome AS nomeprocedimento
FROM medicos AS m
    INNER JOIN medicoprocedimento AS mp 
            ON m.id = mp.medicoid 
           AND m.id = 123
    LEFT JOIN procedimentos AS p ON mp.procedimentoid = p.id

我打赌第二个LEFT JOIN 也可以替换为INNER JOIN

【讨论】:

  • 这个查询不等于问题中的那个。
  • @AntonínLejsek 你确定吗? LEFT JOIN ON idWHERE id = somethingINNER JOIN on id = something 相同
  • 如果没有 medicoprocedimento,内部联接将不返回任何行。即使在这种情况下,左连接也会返回 medicos。
  • @AntonínLejsek 你是对的,我认为Wheremp.medicoid
  • 感谢您的建议,但我有一种情况,我可以在 medicos 中拥有一些 medicoprocedimento 中不存在的 id,因此这不符合我的需求。
猜你喜欢
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多