Mysql 条件句在哪里或在哪里连接?
假设我有以下查询:Mysql 条件句在哪里或在哪里连接?,mysql,Mysql,假设我有以下查询: SELECT occurs.*, events.* FROM occurs INNER JOIN events ON (events.event_id = occurs.event_id) WHERE event.event_state = 'visible' 执行相同查询并获得相同结果的另一种方法是: SELECT occurs.*, events.* FROM occurs INNER JOIN events ON (events.event_id =
SELECT occurs.*, events.*
FROM occurs
INNER JOIN events ON (events.event_id = occurs.event_id)
WHERE event.event_state = 'visible'
执行相同查询并获得相同结果的另一种方法是:
SELECT occurs.*, events.*
FROM occurs
INNER JOIN events ON (events.event_id = occurs.event_id
AND event.event_state = 'visible')
我的问题。真的有区别吗?一条路比另一条快吗?为什么我会选择一种方式而不是另一种方式?对于
内部联接
,在中设置条件与在中设置条件在概念上没有区别。对于将一个表中的键连接到另一个表中的外键的情况,通常使用ON
,例如事件id
,以便维护代码的其他人可以查看表之间的关系
如果您怀疑您的数据库引擎错误地优化了查询计划,您可以尝试两种方法。确保对查询进行多次计时以隔离缓存的影响,并确保运行分析表发生
和分析表事件
以向优化器提供有关键分布的更多信息。如果发现差异,请让数据库引擎解释它生成的查询计划。如果存在严重的错误优化,您可以创建一个Oracle帐户并针对MySQL提交一个功能请求,以更好地优化特定查询
但是对于左连接
,有很大的区别。如果存在详细信息,则通常使用左联接
从单独的表中添加详细信息;如果不存在详细信息,则返回没有详细信息的行。如果b
中没有一行符合以下两个条件,则此查询将返回NULL
值为b.*
的结果行:
SELECT a.*, b.*
FROM a
LEFT JOIN b
ON (condition_one
AND condition_two)
WHERE condition_three
然而,这一项将完全忽略与条件二不匹配的结果:
SELECT a.*, b.*
FROM a
LEFT JOIN b ON some_condition
WHERE condition_two
AND condition_three
此答案中的代码是双重许可的:或者。如果数据库将向您显示差异,则对这两个查询执行一个执行计划!第二个更快。特别是如果在每次查询之前都有event.event\u state
indexedadEXPLAIN
。它将向您展示查询优化器如何运行它以及使用的索引。另外,我很确定这些是相同的。相关: