Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询-更好的性能和更具体的连接?_Mysql_Performance_Join - Fatal编程技术网

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

我正在编写一个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


如果字段被索引,通常不会有太大的区别,因为查询优化器会看到您正在从
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你是对的,我认为
的位置是
was
mp.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
在某些情况下为空?除非某些约束成立,否则这些函数将返回两个不同的输入函数,因此争论哪个更快是没有意义的。此外,这表明没有研究。此外,“更快”取决于你没有给出的情况。