项目中有与几个表相关的业务需求。在这些情况下,以下两个查询选项有利于性能优化。我该如何选择? 第一:过滤笛卡尔积:
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
请告诉我。非常感谢你。
答案 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)。