2011-03-17 40 views
23

可能重复:
MySQL: Inner join vs Where
Explicit vs implicit SQL joinsMySQL性能优化:加入ON VS WHERE

有什么不同的表现明智的,当我们需要运行 “JOIN ON” 和“WHERE连接查询“条款? (无论表格的数量或表格中的条目数量)

不确定是否已经讨论过该主题。即使如此,我也想知道是否使用最新版本的MySQL(5.1及以上版本),事情已经发生了变化。

一个解释性声明清楚地表明考虑行数的差异很大。

我使用的语法是:

使用JOIN ON

SELECT <field names> 
FROM <table1> 
JOIN <table2> ON <join_condition> 
AND JOIN <table3> ON <join_condition> 
AND JOIN <table4> ON <join_condition> 
.... 

使用WHERE

SELECT <field names> 
FROM <table names list separated by comma> 
WHERE <join_condition> 
AND <join_condition> 
AND <join_condition> 
.... 

所以不能确定是否使用JOIN的ON或WHERE子句中会有所作为。请协助。

+1

重复http://stackoverflow.com/questions/5273942/mysql-inner-join-vs-where和http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins – 2011-03-17 12:22:53

+1

嗯......它可能不是重复的,因为Vasanthakumar建议解释计划是不同的。你能提供这些计划吗? – 2011-03-17 12:32:35

+0

不知道关于MySQL,但在Oracle中这些是完全等价的。 – 2011-03-17 12:36:26

回答

2

我怀疑使用“JOIN”正在做“左连接”。尝试使用“INNER JOIN”并查看explain语句是否相同。

SELECT <field names> 
FROM <table1> 
INNER JOIN <table2> ON <join_condition> 
INNER JOIN <table3> ON <join_condition> 
INNER JOIN <table4> ON <join_condition> 
... 

当使用内部联接时,我不会指望你的两个查询之间存在性能差异。我会担心更多有关正确的索引。确保连接条件可以使用索引列进行匹配。

+0

这将是相当令人惊讶的。 'LEFT JOIN'是'LEFT OUTER JOIN'的同义词。查看文档:http://dev.mysql.com/doc/refman/5.1/en/join.html – 2011-03-17 12:50:40

+0

你是对的。忽略我最初的陈述。 – 2011-03-17 15:02:48

+3

'JOIN ... ON'是'INNER JOIN'的同义词,没有'ON'的'JOIN'是'CROSS JOIN'的同义词。文档:http://dev.mysql.com/doc/refman/5.0/en/join.html – 2015-01-21 18:38:26

2

下面是这两种方法的一个很好的分析:SQL left join vs multiple tables on FROM line?

这种解释是通用的,我也不太清楚是什么的MySQL在做这件事情;但无论哪种方式,JOIN总是更加明确和清晰,并且可以从一个引擎移动到另一个引擎,而不会对查询逻辑进行重大更改。