老程序员了,以前碰到外键关联的时候总是用=,只有不得不用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者执行结果不一致的情况),关联表的主键均有索引

解决方案 »

  1.   

    不管有没有,LEFT JOIN 的效率比INNER JOIN 的效率都低!!!!
      

  2.   

    我用explain查过,不过我不懂explain的内容,能帮忙解释一下吗?
      

  3.   


    LEFT JOIN 不管怎么样是把左边的表整体放到MEMORY里面去运算。
    INNER JOIN是过滤了一遍,然后把相同的结果放到MEMORY里面去运算。
      

  4.   

    1、不能简单地这样比较吧,关键是要根据你的具体任务来判断;
    2、结果的准确性>效率;
    3、从连接原理来讲,应该差距不大,LEFT JOIN保留左边表的所有数据,
    INNER JOIN只保留符合条件的记录,除非两个连接的表记录数非常大,
    那么INNER JOIN>LEFT JOIN,可以测试一下。
      

  5.   

    呵呵,不是吧,我在对两个大约有1万条记录进行连接,LEFT与INNER几乎没有差距,
    20万条记录,LEFT<INNER,两表结构一致,说明了什么?
    只有理论上的知识是不够的,实践是检验真理的唯一标准。
      

  6.   

    再次测试,两表两表结构一致,索引、字段名一致,85000条记录,
    left join 55 inner join :29 second
      

  7.   

    假设 A表10条记录,B表85000
    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秒
      

  8.   


    记录也太小了吧,wwww兄!
    搞点大的测试吧,小的记录没有任何意义。
    ^^
      

  9.   

    呵呵,只是说明速度要根据你的具体情况来判断,并不是绝对的,
    我的原则:在1万条以下两种都用,以上要用INNER JOIN,
    一般来讲,INNER JOIN>LEFT JOIN,只不过记录少不明显,
    越多越明显
      

  10.   

    我用我们的数据库给测试了一下:
    其中 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 秒)
      

  11.   

    left join 会保留左表的所有数据,这样使得查找的时候可以根据两个表的大小进行优化