显式和隐式内部联接是否存在效率差异? 例如:
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
与
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
#1楼
在MySQL 5.1.51上,两个查询的执行计划相同:
mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| 1 | SIMPLE | b | ALL | PRIMARY | NULL | NULL | NULL | 986 | |
| 1 | SIMPLE | a | ref | pid | pid | 4 | schema.b.pid | 70 | |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)
mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| 1 | SIMPLE | b | ALL | PRIMARY | NULL | NULL | NULL | 986 | |
| 1 | SIMPLE | a | ref | pid | pid | 4 | schema.b.pid | 70 | |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)
table1具有166208行; table2大约有1000行。
这是一个非常简单的情况; 它绝不证明查询优化器不会在更复杂的情况下产生混乱并生成不同的计划。
#2楼
第二种语法具有交叉联接的可能性:您可以将表添加到FROM部分,而无需相应的WHERE子句。 这被认为是有害的。
#3楼
以我的经验,使用子句中的交叉联接常常会导致大脑受损的执行计划,尤其是在使用Microsoft SQL产品的情况下。 例如,SQL Server尝试估算表行数的方法非常可怕。 使用内部联接语法使您可以控制查询的执行方式。 因此,从实际的角度来看,鉴于当前数据库技术的简单性,您必须使用内部联接。
#4楼
在性能方面,它们是完全相同的(至少在SQL Server中)。
PS:请注意,自SQL Server 2005起不建议使用IMPLICIT OUTER JOIN语法。(仍支持问题中使用的IMPLICIT INNER JOIN语法)
#5楼
就我个人而言,我更喜欢连接语法,因为它可以更清楚地表明表是如何连接以及如何连接的。 尝试比较较大的SQL查询,从8个不同的表中进行选择,然后在where中进行大量筛选。 通过使用联接语法,您可以将联接表的部分分离到要过滤行的部分。