老程序员了,以前碰到外键关联的时候总是用=,只有不得不用left join的时候才用它(ORACLE中是(+))
比如用户表,性别字段关联到性别代码表,民族字段关联到民族代码表,我写SQL通常是这样:select ... from sy_user a,cd_gender b,cd_nationality c
where a.gender=b.code and a.nationality=c.code我知道用left join也可以实现一样的功能:
select ... from sy_user a left join cd_gender on a.gender=b.gender left join cd_nationality c on a.nationality=c.code而且知道left join的一个好处,那就是外键约束不严格的时候,查询时不会漏掉记录。
比如user表某条记录的gender字段为空,用上面的SQL就可能选不出来而下面的没有问题。我的问题是:
1、如果没有where条件,2者的执行效率相比如何?
2、如果有where条件,比如用户的注册时间约束,2者的执行效率相比又如何?
前提假设是数据库中有明确的外键关联关系(不会出现2者执行结果不一致的情况),关联表的主键均有索引
比如用户表,性别字段关联到性别代码表,民族字段关联到民族代码表,我写SQL通常是这样:select ... from sy_user a,cd_gender b,cd_nationality c
where a.gender=b.code and a.nationality=c.code我知道用left join也可以实现一样的功能:
select ... from sy_user a left join cd_gender on a.gender=b.gender left join cd_nationality c on a.nationality=c.code而且知道left join的一个好处,那就是外键约束不严格的时候,查询时不会漏掉记录。
比如user表某条记录的gender字段为空,用上面的SQL就可能选不出来而下面的没有问题。我的问题是:
1、如果没有where条件,2者的执行效率相比如何?
2、如果有where条件,比如用户的注册时间约束,2者的执行效率相比又如何?
前提假设是数据库中有明确的外键关联关系(不会出现2者执行结果不一致的情况),关联表的主键均有索引
LEFT JOIN 不管怎么样是把左边的表整体放到MEMORY里面去运算。
INNER JOIN是过滤了一遍,然后把相同的结果放到MEMORY里面去运算。
2、结果的准确性>效率;
3、从连接原理来讲,应该差距不大,LEFT JOIN保留左边表的所有数据,
INNER JOIN只保留符合条件的记录,除非两个连接的表记录数非常大,
那么INNER JOIN>LEFT JOIN,可以测试一下。
20万条记录,LEFT<INNER,两表结构一致,说明了什么?
只有理论上的知识是不够的,实践是检验真理的唯一标准。
left join 55 inner join :29 second
SELECT * FROM a inner JOIN B ON a.bh=b.bh
0。76
left :0.75秒假设 B表10条记录,A表85000
SELECT * FROM a inner JOIN B ON a.bh=b.bh
0。74
left :0.82秒
记录也太小了吧,wwww兄!
搞点大的测试吧,小的记录没有任何意义。
^^
我的原则:在1万条以下两种都用,以上要用INNER JOIN,
一般来讲,INNER JOIN>LEFT JOIN,只不过记录少不明显,
越多越明显
其中 A表4,355,385条记录,B表423,178条记录
SELECT b.bh, a.* FROM a inner JOIN B ON a.bh=b.bh
(4,355,385 总计, 查询花费 0.0145 秒)