我遇到了以不同方式编写查询,如下所示 的 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数据库
两者都很好,但我想知道
提前致谢
答案 0 :(得分:10)
1-这是一个没脑子的人,使用Type I
2-类型II连接也称为“隐式连接”,而类型I称为“显式连接”。使用现代DBMS,普通查询不会出现任何性能问题。但我认为对于一些大型复杂的多连接查询,DBMS可能会遇到隐式连接问题。只使用显式连接可以改善您的解释计划,从而加快结果!
3-因此,性能可能是一个问题,但最重要的是,可读性可以进一步提高维护性。显式连接准确解释了您想要在哪个字段上加入的内容,而如果您创建连接或过滤器则不会显示隐式连接。 Where子句用于过滤,而不是用于连接!
显式连接有一个很大的优点:外连接对于隐式连接非常烦人。当您想要使用外连接进行多次连接时,显式连接是解决方案时很难阅读。
4-执行计划是您所需要的(See the doc)
有些重复:
Explicit vs implicit SQL joins
答案 1 :(得分:1)
在我看到的大多数代码中,这些查询都像你的Type-II一样完成 - 但我认为Type-I因为可读性而更好(更多逻辑 - 连接是一个连接,所以你应该把它写成一个连接(第二个是另一个内部连接的写作风格))。
在性能方面,应该没有区别(如果有的话,我认为Type-I会更快一些)。
答案 2 :(得分:1)
看看“解释”-syntax http://dev.mysql.com/doc/refman/5.1/en/explain.html
答案 3 :(得分:1)
我的建议。
使用一定数量的记录更新所有表格。访问MySQL控制台并逐个运行SQL命令。您可以在控制台中查看时间执行时间。
答案 4 :(得分:1)
对于您提到的两个查询(每个查询只有内部联接),任何现代数据库的查询优化器都应该生成完全相同的查询计划,从而产生相同的性能。
对于MySQL,如果您使用EXPLAIN
作为查询的前缀,它将吐出有关查询计划的信息(而不是运行查询)。如果来自两个查询的信息相同,则查询计划相同,并且性能将相同。来自MySQL Reference Manual:
EXPLAIN返回一行信息 对于SELECT中使用的每个表 声明。表格列于 MySQL的顺序输出 会在处理时读取它们 查询。 MySQL使用解析所有连接 嵌套循环连接方法。这意味着 MySQL从第一行读取一行 表,然后找到匹配的行 在第二个表中,第三个表, 等等。当所有表都是 处理后,MySQL输出所选 列和回溯通过 表格列表,直到找到表格为止 哪个匹配行更多。 从该表中读取下一行 并且过程继续进行 下一张桌子。
使用EXTENDED关键字时, EXPLAIN生成额外信息 可以通过发布SHOW来查看 警告声明如下 EXPLAIN声明。此信息 显示优化程序的限定条件 SELECT中的表和列名称 声明,SELECT的样子 在重写和应用之后 优化规则,可能还有其他规则 关于优化过程的说明。
哪种语法更好?这取决于你,但是一旦你超越内连接到外连接,你将需要使用更新的语法,因为没有使用旧的隐式连接语法来描述外连接的标准。