哪个查询更好更高效 - mysql
Posted
技术标签:
【中文标题】哪个查询更好更高效 - mysql【英文标题】:which query is better and efficient - mysql 【发布时间】:2011-03-09 11:59:52 【问题描述】:我发现用不同的方式编写查询,如下所示 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数据库
两者都很好,但我想知道
-
在任何情况下始终使用哪种最佳做法?
在性能方面哪个更好?(将数据库称为数百万条记录)
两者相比有什么优势?
有什么工具可以让我检查哪个查询更好?
提前致谢
【问题讨论】:
edit: Scorpi0 提到的很好,一定要看看他的 SO-links nop,DBMS 检测到内部连接,它不执行交叉连接 嗯,我想我在 MySQL 论坛的某个地方读过它,但你可能是对的。也许我能找到这篇文章,谢谢你的指出! 【参考方案1】: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
【讨论】:
【参考方案2】:在我见过的大多数代码中,这些查询都像您的 Type-II 一样完成 - 但我认为 Type-I 更好,因为它具有可读性(以及更多逻辑 - 连接就是连接,所以您应该将其写为一个连接(虽然第二个只是内部连接的另一种写作风格)。
在性能上应该没有区别(如果有的话,我认为Type-I会快一点)。
【讨论】:
【参考方案3】:查看“解释”-语法 http://dev.mysql.com/doc/refman/5.1/en/explain.html
【讨论】:
【参考方案4】:我的建议。
用一定数量的记录更新所有表。访问 MySQL 控制台并一一运行 SQL 命令。您可以在控制台中查看时间执行时间。
【讨论】:
【参考方案5】:对于您提到的两个查询(每个都只有内部连接),任何现代数据库的查询优化器都应该产生完全相同的查询计划,因此具有相同的性能。
对于 MySQL,如果您在查询前加上 EXPLAIN
,它将吐出有关查询计划的信息(而不是运行查询)。如果两个查询的信息相同,则查询计划相同,性能也相同。来自MySQL Reference Manual:
EXPLAIN 返回一行信息 对于 SELECT 中使用的每个表 陈述。表格列于 按照 MySQL 的顺序输出 会在处理时读取它们 询问。 MySQL使用解析所有连接 嵌套循环连接方法。这意味着 MySQL 从第一行读取一行 表,然后找到匹配的行 在第二张表,第三张表中, 等等。当所有表都 处理后,MySQL 输出选定的 列和回溯通过 表列表,直到找到一个表 其中有更多匹配的行。 从此表中读取下一行 并且该过程继续进行 下一张桌子。
当使用 EXTENDED 关键字时, EXPLAIN 产生额外的信息 可以通过发出 SHOW 查看 WARNINGS 声明后 解释声明。这条信息 显示优化器如何限定 SELECT 中的表名和列名 语句,SELECT 的样子 在应用重写和 优化规则,可能还有其他 关于优化过程的说明。
至于哪种语法更好?这取决于您,但是一旦您从内部联接转移到外部联接,您将需要使用较新的语法,因为没有使用旧的隐式联接语法描述外部联接的标准。
【讨论】:
以上是关于哪个查询更好更高效 - mysql的主要内容,如果未能解决你的问题,请参考以下文章
哪个更快/更高效——大量的小 MySQL 查询或一个大的 PHP 数组?
MySQL,longtext、text 还是 blob 哪个更高效?提高插入效率