MySQL查询-更好的性能和更具体的连接?
我正在编写一个MySQL查询,我有一个疑问:下面的代码中哪一个更快?我认为如果我在“左连接”(第二个代码)中更具体一些,应该会更快。这种方法正确吗MySQL查询-更好的性能和更具体的连接?,mysql,performance,join,Mysql,Performance,Join,我正在编写一个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
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
或
如果字段被索引,通常不会有太大的区别,因为查询优化器会看到您正在从
medicoprocedmento.medicoid
(或medicos.id
)列中查找单个值。因此,它通常会在执行联接之前对该值进行索引查找/扫描,即使您只在where
子句中有筛选器,而不是直接在join
中
这就是说,您应该始终检查您的执行计划,以验证在确定您的选择之前正在进行此优化。运行查询时,除了查看实际发生的情况外,没有其他方法可以替代。如果字段被索引,通常不会有太大的区别,因为查询优化器会看到您正在从
medicoprocedmento.medicoid
(或medicos.id
)列中查找单个值。因此,它通常会在执行联接之前对该值进行索引查找/扫描,即使您只在where
子句中有筛选器,而不是直接在join
中
这就是说,您应该始终检查您的执行计划,以验证在确定您的选择之前正在进行此优化。运行查询时,没有什么可以替代查看实际发生的情况。您可以使用EXPLAIN来知道哪一个更快,但是对于您的示例,应该是相同的。您可以使用EXPLAIN来知道哪一个更快,但是对于您的示例,应该是相同的。添加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
我打赌第二个
左连接
也可以被内部连接所取代
添加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
我打赌第二个
左连接
也可以替换为内部连接
此查询不等于问题中的查询。@AntonínLejsek你确定吗<代码>id上的左连接与相同,其中id=something
与id=something上的内部连接
如果没有MedicoprocedO,内部连接将不返回任何行。即使在这种情况下,Left join也会返回medicos。@AntonínLejsek你是对的,我认为的位置是wasmp.medicoid
谢谢你的建议,但我有一个场景,在medicos中我可以有一些Medicoprocedmento中没有的id,所以这不符合我的需要。这个查询不等于问题中的查询。@AntonínLejsek你确定吗<代码>id上的左连接
与相同,其中id=something
与id=something上的内部连接
如果没有MedicoprocedO,内部连接将不返回任何行。即使在这种情况下,Left join也会返回medicos。@AntonínLejsek你是对的,我认为的位置是mp。medicoid
谢谢你的建议,但我有一个场景,在medicos中我可以有一些medicoprocedimento中没有的id,所以这不适合我的需要。我尝试解释(命令)但我得到了同样的答案。所以,我提出这个问题是为了看一些观点。如果explain命令显示相同的结果,那么它应该是相同的。好的,但是今天我没有太多行。我想在一个有大量行的场景中,它是否可以有不同的性能。只要EXPLAIN命令中使用的索引相同,性能就会相同。如果我错了,我很高兴知道:)我试过解释(命令),但我得到了相同的答案。所以,我提出这个问题是为了看一些观点。如果explain命令显示相同的结果,那么它应该是相同的。好的,但是今天我没有太多行。我想在一个有大量行的场景中,它是否可以有不同的性能。只要EXPLAIN命令中使用的索引相同,性能就会相同。如果我错了,我很高兴知道:)我喜欢你的考虑。非常感谢你!(对不起,我的英语很差)我喜欢你的考虑。非常感谢你!(对不起,我的英语很差)请提供显示创建表
。您真的需要左
?您是否希望p.nome
在某些情况下为空?除非某些约束成立,否则这些函数将返回两个不同的输入函数,因此争论哪个更快是没有意义的。此外,这表明没有研究。“更快”还取决于您没有给出的情况。请提供SHOW CREATE TABLE
。您真的需要左
?您是否希望p.nome
在某些情况下为空?除非某些约束成立,否则这些函数将返回两个不同的输入函数,因此争论哪个更快是没有意义的。此外,这表明没有研究。此外,“更快”取决于你没有给出的情况。