mysql - 哪个查询更好更高效 - mysql

标签 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. 有什么工具可以让我检查哪个查询更好吗?

提前致谢

最佳答案

1- 很简单,使用 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

关于mysql - 哪个查询更好更高效 - mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3138742/

相关文章:

mysql - 类别和标签的数据结构

mysql - 在关系数据库中存储列表的最有效方法是什么?

sql - 在两个数据库表中进行循环引用是一种好习惯吗

java - 登录到远程 mysql 数据库的身份验证

mysql - sql在一个查询中获取总计数和过滤计数

sql - 什么时候使用复合索引?

php - 了解数据库表的 JSON 输出

php - 删除从数据库检索的 TIME 函数前面的零?

MYSQL查询慢,如何优化?

mysql - SQL - 试图判断查询的哪一部分与 'OR' 语句匹配