不同的SQL查询效率

时间:2017-02-13 09:02:26

标签: mysql sql-optimization

项目中有与几个表相关的业务需求。在这些情况下,以下两个查询选项有利于性能优化。我该如何选择?    第一:过滤笛卡尔积:

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

第二种:左外连接模式或右外连接模式

 select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

请告诉我。非常感谢你。

2 个答案:

答案 0 :(得分:0)

如果您以提供相同结果的形式编写它们,请期望查询分析器为您提供相同的*查询计划。那说使用JOIN而不是, ,因为,不太清楚,已被弃用了几十年

如果要比较两个不同查询的性能,最简单的方法是运行它们并比较它们花费的时间,尽管通过比较查询计划(EXPLAIN query text here在mysql中检查它们是否正在执行不同的操作会给你一个查询的计划)

请注意,“我知道他们会给出不同的结果,但我想要更快的结果”在编程中从来都不是一个明智的说法。你应该总是确切地知道你想要的结果。

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id

具有相同的含义
select table1.a ,table2.b from table1 join table2 on table1.id=table2.id

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id

具有相同的含义
select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2)

你没有使用的联接表格:

select table1.a ,table2.b from table1 right join table2 on table1.id=table2.id

具有相同的含义
select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1)

select table1.a ,table2.b from table1 full join table2 on table1.id=table2.id

具有相同的含义
select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2)
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1)

答案 1 :(得分:-2)

第二次查询更快。它没有嵌套条件。 SQL引擎将join视为单个表或视图。

在我的openion中,第一个查询作为“For循环”工作,因此运行时复杂度为O(n),而seconf查询作为Switch Case工作,更糟糕的运行时复杂度为O(log n)。