哪个查询是更好和更有效 - mysql的

哪个查询是更好和更有效 - mysql的

问题描述:

我碰到写在不同的充方式查询像图所示 I型哪个查询是更好和更有效 - mysql的

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. 有什么工具可以检查哪个更好?

提前感谢

在大多数代码我见过
+0

编辑: Scorpi0提到它相当好,一定要看看他的SO-links – DrColossos 2010-06-29 08:05:34

+0

nop,DBMS检测到内部连接,它不会执行交叉连接 – 2010-06-29 08:10:21

+0

嗯,我想我在某处读它在MySQL论坛中,但你可能是对的。也许我可以找到这篇文章,谢谢指出! – DrColossos 2010-06-29 08:14:25

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

,这些querys完成像你的II型 - 但我认为I型是因为可读性(更逻辑的更好 - 联接是一个连接,所以你应该把它写成一个连接(第二个只是内部连接的另一种写法))。

在表现上,应该没有差别(如果有的话,我认为Type-I会快一点)。

我的建议。

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

对于你提到的两个查询(每个只有内部连接)任何现代数据库的查询优化r应该产生完全相同的查询计划,并因此具有相同的性能。

对于MySQL,如果以EXPLAIN作为查询的前缀,它将会吐出有关查询计划的信息(而不是运行查询)。如果来自两个查询的信息都是相同的,那么他们的查询计划是相同的,并且性能将是相同的。从MySQL Reference Manual

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

当使用扩展关键字, EXPLAIN产生可以通过发出以下的 EXPLAIN语句一个SHOW 警告语句被视为额外信息 。该信息显示 优化如何有资格在SELECT语句 关于优化过程 表和列名,什么SELECT样子 重写的应用和 优化规则后,和其他可能的 笔记。

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