我遇到过用不同的方式编写查询,如下所示 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- 很简单,使用 I 型
2- II 型联接也称为“隐式联接”,而 I 型称为“显式联接”。使用现代 DBMS,正常查询不会有任何性能问题。但我认为对于一些大型复杂的多连接查询,DBMS 可能会出现隐式连接问题。仅使用显式连接可以改进您的解释计划,从而更快地得到结果!
3- 因此性能可能是个问题,但也许最重要的是,可读性得到提高以便进一步维护。显式连接会准确说明您要在哪个字段上连接什么,而隐式连接不会显示您是否进行了连接或过滤。 Where 子句用于过滤,而不用于连接!
显式连接的一个重要问题是:外连接对于隐式连接来说真的很烦人。当您想要使用外部连接进行多重连接时,阅读起来非常困难,因此显式连接是解决方案。
4- 执行计划是你所需要的 ( See the doc )
一些重复的:
Explicit vs implicit SQL joins
关于mysql - 哪个查询更好更高效 - mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3138742/