哪个查询是更好和更有效 - 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 - 这是没有道理的,使用I型
2- II型联接也被称为“隐式连接”,而I型被称为“显式连接”。使用现代DBMS,您不会遇到正常查询的任何性能问题。但我认为,通过一些大型复杂的多连接查询,DBMS可能会遇到隐式连接的问题。只使用显式连接可以改进你的解释计划,所以速度更快!
3-因此,性能可能是一个问题,但最重要的是,可读性对于进一步维护而言是有所改进的。显式连接明确地解释你想要在什么字段上加入的内容,而隐式连接则不会显示你是否创建了连接或过滤器。 Where子句用于过滤,不用于加入!
显式连接的一大亮点:外连接实际上是隐式连接的烦人。当你想要使用外部连接进行多重连接时,阅读很难,显式连接是解决方案。
4-执行计划是什么,你需要(See the doc)
有些重复:
Explicit vs implicit SQL joins
,这些querys完成像你的II型 - 但我认为I型是因为可读性(更逻辑的更好 - 联接是一个连接,所以你应该把它写成一个连接(第二个只是内部连接的另一种写法))。
在表现上,应该没有差别(如果有的话,我认为Type-I会快一点)。
我的建议。
用一些记录更新所有表格。访问MySQL控制台并逐个运行SQL命令。您可以在控制台中查看时间执行时间。
对于你提到的两个查询(每个只有内部连接)任何现代数据库的查询优化r应该产生完全相同的查询计划,并因此具有相同的性能。
对于MySQL,如果以EXPLAIN
作为查询的前缀,它将会吐出有关查询计划的信息(而不是运行查询)。如果来自两个查询的信息都是相同的,那么他们的查询计划是相同的,并且性能将是相同的。从MySQL Reference Manual:
EXPLAIN返回的信息 排在SELECT语句 使用的每个表。这些表在 中列出,输出的顺序是MySQL 在处理 查询时将读取它们。 MySQL使用 嵌套循环连接方法解析所有连接。这意味着MySQL将从第一个 表中读取一行,然后在第二个表,第三个表, 等中找到匹配的行 。当处理所有表为 时,MySQL通过 表中的列表输出选定的 列和回溯,直到找到 表中存在更多匹配行的表为止。 下一行从此表中读取 ,并且该过程继续执行 下一个表格。
当使用扩展关键字, EXPLAIN产生可以通过发出以下的 EXPLAIN语句一个SHOW 警告语句被视为额外信息 。该信息显示 优化如何有资格在SELECT语句 关于优化过程 表和列名,什么SELECT样子 重写的应用和 优化规则后,和其他可能的 笔记。
至于哪种语法更好?这取决于你,但是一旦你超越内部连接到外部连接,你将需要使用更新的语法,因为没有使用较老的隐式连接语法来描述外部连接的标准。
编辑: Scorpi0提到它相当好,一定要看看他的SO-links – DrColossos 2010-06-29 08:05:34
nop,DBMS检测到内部连接,它不会执行交叉连接 – 2010-06-29 08:10:21
嗯,我想我在某处读它在MySQL论坛中,但你可能是对的。也许我可以找到这篇文章,谢谢指出! – DrColossos 2010-06-29 08:14:25