【问题标题】:Conditions in WHERE clause and in ON clauseWHERE 子句和 ON 子句中的条件
【发布时间】:2012-07-05 11:17:49
【问题描述】:

假设我有两张桌子,

   Student                           Test

Id    Name                   TestId   Type  StudentId
--    ----                   ------   ----  --------- 
1     Mark                     774    Hard     1  
2     Sam                      774    Hard     2 
3     John                     775    Easy     3

现在我必须找到那些在 MySql 中参加过“硬”类型测试的学生(学生 id、姓名和 testid)。

哪个更好(在性能方面)?

1.Select student.id,student.name,test.testid 
  from student 
  join test 
  on test.studentid=student.id and test.type='hard'

2.Select student.id,student.name,test.testid 
  from student 
  join test 
  on test.studentid=student.id 
  where test.type='hard'

我可以知道原因吗?(假设有数百万学生和数百万种测试)

【问题讨论】:

  • 如果通过分析器运行查询,执行计划有什么不同? (附带问题...TestUser 真的是多对一的吗?也许我不知道您的域,但我认为会有有限数量的测试实体和有限数量的用户实体以及两者之间的多对多关系。真的有百万唯一测试实体吗?)
  • @David 是的,这是一个多对多的关系,但我的例子并没有显示出来......是的,也许我夸大了几百万个独特的实体。但是我说有许多独特的测试类型的原因是我认为很少有独特的实体,两个查询具有相同的性能,但没有很大。的实体,差异可能是巨大的。
  • @vyegorov 请正确阅读问题...我不是在谈论左外连接。我也知道 where 子句在连接后执行...我只想知道性能

标签: mysql sql


【解决方案1】:

两者相同,但性能不同。如果您想选择性能更好的查询,我建议您使用EXPLAIN PLAN 进行查询。

看看Understanding the Query Execution Plan

您还可以使用INDEXES 改进您在WHERE 子句中最常使用的列的查询,您也可以查看关系代数。

【讨论】:

  • 是的,我想使用解释计划,但我可以将查询作为 Web 服务运行。(即我键入查询,当我单击运行时,会调用一个返回结果的 Web 服务)。所以我无权解释计划。另外,我只有100多条记录。所以性能差异不会太大。
  • 您可以创建本地数据库,创建并填充表格,然后创建您将使用的语句并测试它们,哪一个具有最佳性能。
  • @kannan:“另外,我只有 100 多条记录。所以性能差异不会太大。”如果差异不会太大,您为什么关心哪个更快?
【解决方案2】:

这些查询完全相同,并且应该具有完全相同的查询计划。执行时间不太可能有任何可测量的差异。

但是,如果您将JOIN 更改为LEFT JOIN,将会有所不同。在这种情况下,您需要使用第一个版本。第二个版本不会给出相同的结果。

【讨论】:

    【解决方案3】:

    在性能方面,这两者大致相同。您可以使用 EXPLAIN 命令进行验证。

    所以问题变成了数据模型表达的清晰度之一。它可能看起来像天使在针头上跳舞。但是,如果您使用 JOIN 命令提取所有测试结果,然后请求一个子集,请使用 WHERE type='hard'

    但是,如果从概念上讲,您只拉硬的,那么请使用ON 公式。

    请注意,如果您使用LEFT JOIN,这两者的工作方式会有所不同。如果您将ON 公式与LEFT JOIN 结合使用,您将得到一个未参加过硬测试的学生的行,以及每个学生参加的每个硬性测试的行。

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2015-05-15
      • 2014-09-30
      相关资源
      最近更新 更多