为什么我在SQL中选择INNER JOIN 而不选择 WHERE a.id = b.a_id
博客专区 > weechang 的博客 > 博客详情
为什么我在SQL中选择INNER JOIN 而不选择 WHERE a.id = b.a_id
weechang 发表于1年前
为什么我在SQL中选择INNER JOIN 而不选择 WHERE a.id = b.a_id
  • 发表于 1年前
  • 阅读 91
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: sql中建议选择inner join 替代 where a.id = b.a_id,从而避免笛卡尔乘积

在多表查询的sql中,很多开发人员喜欢选择where作为连接条件; 如:

SELECT
	a.id,
	a.basic_salary,
	p.position_name
FROM
	salary_plan a,
	salary_position p
WHERE
	a.position_id = p.id

这样其实是存在一个很大的效率问题的,究竟如何请听我细细道来。

缺点:在上面这个sql中其实是创建了两张表的笛卡尔乘积的,所有有可能的集合都会被组合起来。在上表中如果 a表有1000条记录,p表有1000条记录,那么笛卡尔乘积的结果就是1000,000条记录。然后在生成的1000, 1000 记录中选择符合条件的1000条记录。这样使得数据库多做了1000倍的工作,对资源的浪费不言而喻的。如果是表的数据量小的话,还感觉不到什么压力。但是当表数据量大的话,压力就可想而知了。

在实际生产中我往往喜欢使用inner join来避免笛卡尔乘积的创建,上述sql我往往会使用这样的方法来解决

SELECT
	a.id,
	a.basic_salary,
	p.position_name
FROM
	salary_plan a INNER JOIN
	salary_position p
ON
	a.position_id = p.id

优点:避免了笛卡尔乘积的创建,使用上述sql只会产生1000条目标数据,大大提高了查询效率。

PS:虽然有些数据库的优化器会自动识别出第一条sql优化为第二条sql。但是这只是很少的一部份,至于哪些数据库有,我也不知道。至少我使用的mysql5.6是没有该功能的。但是inner join 是所有数据库都能支持的。因此在实际生产中DBA往往会建议使用inner join来进行查询优化。

注意: join 与 inner join效果相同

mysql查看优化器执行后sql语句可以参考该文章:

http://blog.csdn.net/wangjun5159/article/details/51227831

共有 人打赏支持
粉丝 5
博文 41
码字总数 7818
×
weechang
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: