mysql显式和隐式效率_显式与隐式SQL连接

显式和隐式内部联接是否存在效率差异? 例如:

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中进行大量筛选。 通过使用联接语法,您可以将联接表的部分分离到要过滤行的部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值