之前有个同事是从阿里出来的,
他的框架或SQL中从不带join
如果要关联查询AB表时,先查询A表,
然后从结果集获取与B表关联的ID,
再拼装这些ID放入B表中做为in条件。(或者for去查N次数据库,根据ID去查B表)。
现在问题来了:
1,大家觉得是用in查还是for去查N次好?B表的ID一般是主键的。如果启用了数据库连接池,是不是用for去查N次还比in去查快?(不用打开和关闭N次链接)
2,我们问他为什么不用join,而要这样去查(因为我们之前会join两三个表,可能最多有5个左右),他说了以下几个原因:
A,在表的数据量小时,用join查感觉不到什么耗时,但是数据量大了以后,用join去查是非常耗时的。
B,这样写以后维护方便,看别人一大串SQL是很头疼的事。
我觉得A倒是很重要啊,但如果真是这样,SQL中干嘛要有join关键字呢?
想问题下大家,在数据量很大的时候,你们是怎么取数据的?大家都来说说自己的意见。
join的前提是外键.其实总的来说join还是性能更好的.因为join之前会先过滤主表.再join和过滤查询出来再in id是一样的.
我是觉得维护方便才是最重要的!一般的orm join都很费劲.所以我也不喜欢写join
而且手写sql最大的问题不是代码.而是猪队友.你不约束他.他什么都干的出来.
PS:in绝对比for循环查不知道要块多少.
谢谢你,再问一下假如表有上千万条数据时,join会不会要等很久很久啊。。。
@hexllo: 不会的.你做查询不可能查询这么多出来.这种需求本身就有问题.
一般都是查询几条几十条的.join也是join这过滤后的部分.
但有的人join是全join然后再过滤.就会有问题.但问题也不会很大的.
只能说join确实是少用或不要用.多用单表操作.尽量用id操作.
这个要看你的A表查出来的数据有多少,我也不用join 一般写存储过程,合并两个表
我的代码里也没有join。拿出符合的A数据集。再用ID集去B表查。速度快很多,ID一般都做为主键 是默认索引。条件查询中,查主键速度比其它字段快不知多少倍
我新欢join,不觉得慢
查询速度的快慢和使用in还是使用join没有绝对联系,和查询计划使用的索引才有关系,如果A表和B表是由多列组成的外键,使用in查询一样是慢。而且使用in查询,你最终还是要在内存上匹配对应的数据
还是JOIN好
JION的两表数据很大时,JOIN会很慢,实际项目中遇到过这种情况,一般这种情况使用临时表来优化
for多次查询,这个非常不推荐,宁愿拼接好sql,查一次
不过说实话,性能相关的问题还是要结合实际情况的,你可以在自己的项目中对比下性能,实践出真知