关于内连接mysql的想法

时间:2009-12-20 12:13:36

标签: mysql

我们有超过3米记录的表格。使用innerjoin时,它比select * from db1,db2 where db1.field=db2.field

慢得多

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

INNER JOIN不应该与SELECT FROM t1,t2 WHERE t1.c = t2.c有任何不同,它只是用于执行相同操作的不同语法,并且由优化器对待它。

性能的任何差异都在查询的其他方面。请发帖:

  1. 两个表的模式,包括它们的索引(SHOW CREATE TABLE为您提供)
  2. 您要比较的两个查询
  3. 有关您的性能测试方法的一些细节(可能存在缺陷)
  4. 两个查询的EXPLAIN输出。
  5. 如果你想要一个合理的答案。

答案 1 :(得分:3)

常规中,...where db1.field=db2.field...语法 是内部联接。它只是隐含的符号而不是显式。如果您要加入相同的列并且返回相同的列,则性能应该相同。更多:http://en.wikipedia.org/wiki/Join_(SQL)#Inner_join

答案 2 :(得分:3)

SELECT * from t1,t2 where t1.id = t2.id

相当于

在t1.id = t2.id上从t1 INNER JOIN t2中选择*。

但是,如果SQL查询还有其他条件,则行为可能会有所不同。例如。

SELECT * from t1,t2其中t1.id = t2.id且t1.col1不为空;

可以用INNER JOIN以两种不同的方式编写:

在t1.id = t2.id上的t1 INNER JOIN t2的SELECT *和t1.col1不为空

在t1.id = t2.id上从t1 INNER JOIN t2中选择SELECT * t1.col1不为空

这可能会也可能不会成为同一个查询(根据优化器),以及查询其他部分的复杂性。 EXPLAIN PLAN将告诉您是否正在执行相同的查询。

为什么上述查询有所不同?因为对非空的限制是在查询的不同阶段完成的,这可能会对性能产生影响,甚至会对返回的行数产生影响。

答案 3 :(得分:0)

我通常根据需要使用显式INNER JOINLEFT JOIN语法。当优化器做得不好时,STRAIGHT_JOIN通常可以对其进行排序,并对查询进行适当的重新排列。

任何涉及大型表的连接都值得使用EXPLAIN

相关问题