代码之家  ›  专栏  ›  技术社区  ›  gmhk

哪个查询更好更高效-mysql

  •  7
  • gmhk  · 技术社区  · 14 年前

    我发现用不同的方式编写查询,如下所示 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. 一个比另一个有什么好处?

    提前谢谢

    5 回复  |  直到 14 年前
        1
  •  10
  •   Community Mike Kinghan    7 年前

    1-不用动脑筋,用I型

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

    3-所以性能可能是个问题,但最重要的可能是,可读性的提高,以便进一步维护。显式联接精确地解释了您想要在哪个字段上联接什么,而隐式联接不显示您是否进行了联接或筛选。Where子句用于filter,而不是join!

    显式连接的一大特点是:外部连接对于隐式连接来说非常烦人。当您希望使用外部连接进行多个连接时,很难理解,因此显式连接是解决方案。

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

    一些副本:

    Explicit vs implicit SQL joins

    SQL join: where clause vs. on clause

    INNER JOIN ON vs WHERE clause

        2
  •  1
  •   oezi    14 年前

    在我所看到的大多数代码中,这些查询都是像您的Type-II那样完成的,但是我认为Type-i更好,因为可读性(而且逻辑性更高,连接就是一个连接,所以您应该将其作为一个连接来编写(尽管第二个连接只是内部连接的另一种编写风格))。

        3
  •  1
  •   Codler    14 年前
        4
  •  1
  •   Muneer    14 年前

    我的建议。

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

        5
  •  1
  •   Craig Trader    14 年前

    对于MySQL,如果在查询前面加上 EXPLAIN ,它将吐出有关查询计划的信息(而不是运行查询)。如果两个查询的信息相同,则它们的查询计划相同,性能也相同。从 MySQL Reference Manual

    EXPLAIN返回一行信息 对于选择中使用的每个表 声明。表列在中 会在处理 嵌套循环联接方法。这意味着 表,然后查找匹配的行 等等。当所有的桌子 处理后,MySQL输出所选的 列和回溯通过 表列表,直到找到表为止 有更多的匹配行。 下一行从此表中读取 这个过程继续着 下一张桌子。

    当使用扩展关键字时, 解释产生额外的信息 警告语句 解释陈述。此信息 显示优化器的限定方式 选择中的表和列名 语句,选择 关于优化过程的注释。