数据库用的是mysql,一张大表t1,2000万的记录,一张小表t2,10万记录
第一次用中规中矩的
SELECT * FROM t1 LEFT JOIN t2 ON (t1.stuno=t2.stuno) where t2.spid=4;
结果很正常地出来了,花了76s,然后我有照着今天看的数据库原理里面说的,先查询,后连接,接着试了试
SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2 WHERE spid=4) AS tt2 ON t1.stuno=tt2.stuno;
然后就溢出了
[Err] Out of memory
是不是我的sql语句有问题,新手不太会啊

解决方案 »

  1.   

    p.s.      按理说先查询之后的表tt2肯定是比t2小的,为什么相对来说比较小的表与另外一张表做外联的时候反而溢出,而大的表与相同的一张表做外联反而正常呢?
      

  2.   

    楼主在什么中查询的? 程序中还是MYSQL本身提供的命令行工具?
      

  3.   

    在navicat中
      

  4.   

    这贴的问题我大概想想,今天想通了,各位可以散了,当然如果大家将就着看也就看看吧。
    其实mysql自身就有做优化了,只是我还不知道。
    SELECT * FROM t1 LEFT JOIN t2 ON (t1.stuno=t2.stuno) where t2.spid=4;
    这句本身mysql本身就是先做查询然后再做外联了,所以速度相当快
    而恰恰是脑抽的我犯了一个错,用了左联,应该用右联的,
    所以SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2 WHERE spid=4) AS tt2 ON t1.stuno=tt2.stuno;
    这句话其实是一个2000w的表与一个小表做左联,那么结果应该也是2000w的,所以肯定慢啊。
    抱歉耽误大家的时间,就当个笑话看吧