Mysql 查询性能。哪个最好?

Posted

技术标签:

【中文标题】Mysql 查询性能。哪个最好?【英文标题】:Mysql Query perfomance. Which one is best? 【发布时间】:2011-12-02 22:12:57 【问题描述】:

您好,我想知道哪种查询适合多表。

例如:

select table1.id, table1.name from table1,table2,table3 
where table1.id=table2.id and table2.id=table3.id

select table1.id, table1.name  
from table1 
inner join table2 on table1.id=table2.id 
inner join table3 on table2.id=table3.id 
where 1

select table1.id, table1.name 
from table1 
join table2 on table1.id=table2.id 
join table3 on table2.id=table3.id 
where 1

哪种查询最适合性能?

【问题讨论】:

from table1, table2 是一种称为oops accidental cross join 的反模式。 【参考方案1】:

它们应该完全相同。可能您可能想阅读 mysql 手册中的corresponding section(不过,这只是关于语法,而不是关于性能)。

【讨论】:

【参考方案2】:

我希望所有这 3 个都被解析为完全相同,因此将执行相同的操作。后两个查询中的where 子句是多余的。

与第一个查询中的隐式语法相比,许多开发人员更喜欢显式的 ANSI-92 语法(在后两个查询中使用) - 但是,这不会影响性能。

【讨论】:

【参考方案3】:

正如已经指出的,所有形式在效率方面都是相同的。然而,它们在一个非常重要的方面是不同的:可读性。

这就是我更喜欢使用inner join 语法的原因。这也是标准中流行的符号。

您可能会发现这个问题的答案很有用:SQL Inner Join syntax

【讨论】:

【参考方案4】:

join 只是inner join 的快捷方式,from table1,table2 where 也与内部连接相同(see mysql documentation 和mysql forum)。 mysql 应该以同样的方式处理它们(第二个的解析时间可能会稍微低一点,但可以忽略不计)。

至少你应该选择一个更受欢迎(并且以这种方式可维护)的那个将是第二个(在我看来,有些人可能会喜欢第一个)。

【讨论】:

逗号和JOIN混用就不一样了:逗号运算符的优先级小于INNER JOIN、CROSS JOIN、LEFT JOIN等(来自dev.mysql.com/doc/refman/5.0/en/join.html ) -1,从table1,table2是一个cross join,你可以在where子句中限制结果集并不会改变这个事实。 MySQL 也允许使用内部联接语法进行交叉联接,但这只是 MySQL 与 SQL 标准相悖,其他 DBMS 不允许损坏的内部联接。

以上是关于Mysql 查询性能。哪个最好?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL性能优化以及常用命令

使用 Node.js 选择哪个数据库(NoSQL 或常规 SQL)最好? [关闭]

哪个品牌的示波器性能最好

mssql如何实现多表快速like查询

哪个是 wordpress 插件最好的 mysql 或 mysqli 或 $wpdb

做webapp开发,性能和效率最好的框架和打包app平台分别是哪个