显式和隐式内部联接是否存在效率差别? 例如: mysql
SELECT * FROM table a INNER JOIN table b ON a.id = b.id;
与 sql
SELECT a.*, b.* FROM table a, table b WHERE a.id = b.id;
在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行。 性能
这是一个很是简单的状况; 它毫不证实查询优化器不会在更复杂的状况下产生混乱并生成不一样的计划。 优化
第二种语法具备交叉联接的可能性:您能够将表添加到FROM部分,而无需相应的WHERE子句。 这被认为是有害的。 spa
以个人经验,使用子句中的交叉联接经常会致使大脑受损的执行计划,尤为是在使用Microsoft SQL产品的状况下。 例如,SQL Server尝试估算表行数的方法很是可怕。 使用内部联接语法使您能够控制查询的执行方式。 所以,从实际的角度来看,鉴于当前数据库技术的简单性,您必须使用内部联接。 code
在性能方面,它们是彻底相同的(至少在SQL Server中)。 get
PS:请注意,自SQL Server 2005起不建议使用IMPLICIT OUTER JOIN
语法。(仍支持问题中使用的IMPLICIT INNER JOIN
语法) 产品
就我我的而言,我更喜欢链接语法,由于它能够更清楚地代表表是如何链接以及如何链接的。 尝试比较较大的SQL查询,从8个不一样的表中进行选择,而后在where中进行大量筛选。 经过使用联接语法,您能够将联接表的部分分离到要过滤行的部分。