哪个查询更好,更有效 - mysql

时间:2010-06-29 07:39:42

标签: mysql database database-design inner-join

我遇到了以不同方式编写查询,如下所示 的 I型

SELECT JS.JobseekerID
         , JS.FirstName
         , JS.LastName
         , JS.Currency
         , JS.AccountRegDate
         , JS.LastUpdated
         , JS.NoticePeriod
         , JS.Availability
         , C.CountryName
         , S.SalaryAmount
         , DD.DisciplineName
         , DT.DegreeLevel 
    FROM Jobseekers JS 
INNER 
   JOIN Countries C 
      ON JS.CountryID = C.CountryID 
INNER 
   JOIN SalaryBracket S 
      ON JS.MinSalaryID = S.SalaryID 
INNER 
  JOIN DegreeDisciplines DD 
     ON JS.DegreeDisciplineID = DD.DisciplineID 
INNER 
  JOIN DegreeType DT 
     ON JS.DegreeTypeID = DT.DegreeTypeID 
WHERE
  JS.ShowCV = 'Yes'

II型

SELECT JS.JobseekerID
         , JS.FirstName
         , JS.LastName
         , JS.Currency
         , JS.AccountRegDate
         , JS.LastUpdated
         , JS.NoticePeriod
         , JS.Availability
         , C.CountryName
         , S.SalaryAmount
         , DD.DisciplineName
         , DT.DegreeLevel 
    FROM Jobseekers JS, Countries C, SalaryBracket S, DegreeDisciplines DD
         , DegreeType DT
    WHERE
           JS.CountryID = C.CountryID 
           AND JS.MinSalaryID = S.SalaryID 
           AND JS.DegreeDisciplineID = DD.DisciplineID 
           AND JS.DegreeTypeID = DT.DegreeTypeID 
           AND  JS.ShowCV = 'Yes'

我正在使用Mysql数据库

两者都很好,但我想知道

  1. 哪种情况下最佳做法适用于任何情况?
  2. 性能明智哪个更好?(将数据库称为数百万条记录)
  3. 一个人的优势在哪一个?
  4. 有什么工具我可以查看哪个更好查询?
  5. 提前致谢

5 个答案:

答案 0 :(得分:10)

1-这是一个没脑子的人,使用Type I

2-类型II连接也称为“隐式连接”,而类型I称为“显式连接”。使用现代DBMS,普通查询不会出现任何性能问题。但我认为对于一些大型复杂的多连接查询,DBMS可能会遇到隐式连接问题。只使用显式连接可以改善您的解释计划,从而加快结果!

3-因此,性能可能是一个问题,但最重要的是,可读性可以进一步提高维护性。显式连接准确解释了您想要在哪个字段上加入的内容,而如果您创建连接或过滤器则不会显示隐式连接。 Where子句用于过滤,而不是用于连接!

显式连接有一个很大的优点:外连接对于隐式连接非常烦人。当您想要使用外连接进行多次连接时,显式连接是解决方案时很难阅读。

4-执行计划是您所需要的(See the doc

有些重复:

Explicit vs implicit SQL joins

SQL join: where clause vs. on clause

INNER JOIN ON vs WHERE clause

答案 1 :(得分:1)

在我看到的大多数代码中,这些查询都像你的Type-II一样完成 - 但我认为Type-I因为可读性而更好(更多逻辑 - 连接是一个连接,所以你应该把它写成一个连接(第二个是另一个内部连接的写作风格))。

在性能方面,应该没有区别(如果有的话,我认为Type-I会更快一些)。

答案 2 :(得分:1)

答案 3 :(得分:1)

我的建议。

使用一定数量的记录更新所有表格。访问MySQL控制台并逐个运行SQL命令。您可以在控制台中查看时间执行时间。

答案 4 :(得分:1)

对于您提到的两个查询(每个查询只有内部联接),任何现代数据库的查询优化器都应该生成完全相同的查询计划,从而产生相同的性能。

对于MySQL,如果您使用EXPLAIN作为查询的前缀,它将吐出有关查询计划的信息(而不是运行查询)。如果来自两个查询的信息相同,则查询计划相同,并且性能将相同。来自MySQL Reference Manual

  

EXPLAIN返回一行信息   对于SELECT中使用的每个表   声明。表格列于   MySQL的顺序输出   会在处理时读取它们   查询。 MySQL使用解析所有连接   嵌套循环连接方法。这意味着   MySQL从第一行读取一行   表,然后找到匹配的行   在第二个表中,第三个表,   等等。当所有表都是   处理后,MySQL输出所选   列和回溯通过   表格列表,直到找到表格为止   哪个匹配行更多。   从该表中读取下一行   并且过程继续进行   下一张桌子。

     

使用EXTENDED关键字时,   EXPLAIN生成额外信息   可以通过发布SHOW来查看   警告声明如下   EXPLAIN声明。此信息   显示优化程序的限定条件   SELECT中的表和列名称   声明,SELECT的样子   在重写和应用之后   优化规则,可能还有其他规则   关于优化过程的说明。

哪种语法更好?这取决于你,但是一旦你超越内连接到外连接,你将需要使用更新的语法,因为没有使用旧的隐式连接语法来描述外连接的标准。