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 查询性能。哪个最好?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node.js 选择哪个数据库(NoSQL 或常规 SQL)最好? [关闭]