有二个表:
tb_a 有5万条记录,主键:tid;
tb_b 有6万条记录,主键:fid。
以下是一个简单的sql,为可查询的速度却,非常之慢,好几分钟都都不出结果。SELECT tid FROM tb_a a WHERE not exists (SELECT fid FROM tb_b where fid=a.tid);
请各位高手指点下原因所在。

解决方案 »

  1.   

    SELECT tid FROM tb_a a 
    left join tb_b b on b.fid=a.tidWHERE b.fid is null
    速度如何EXPLAIN 你的SQL语句
      

  2.   

    not exists不应该这么慢
    explain SELECT tid FROM tb_a a WHERE not exists (SELECT fid FROM tb_b where fid=a.tid);
    贴出来看看
      

  3.   


    也是很慢。
    EXPLAIN 结果:
    select_type           table        rows    extra
    -------------------------------------------------------
    PRIMARY               tb_a         11091   Using where
    DEPENDENT SUBQUERY    tb_b         33905   Using where
      

  4.   

    SELECT tid FROM tb_a a 
    left join tb_b b on b.fid=a.tidWHERE b.fid is nullEXPLAIN结果:select_type table   rows   extra
    -------------------------------------------------------
    SIMPLE       a      11091 
    SIMPLE       b      33905  Using where; Not exists
      

  5.   


    EXPLAIN 结果:
    select_type table rows extra
    -------------------------------------------------------
    PRIMARY a 11091 Using where
    DEPENDENT SUBQUERY b 33905 Using where
      

  6.   

    你的索引情况
    DESC 表名
      

  7.   

    字段 tid 和 fid 都会有重复的记录,所以没有建索引或主键。
      

  8.   


    select a.tid,(select b.fid FROM tb_b b where fid=a.tid limit 1) num from tb_a a WHERE num is null
      

  9.   

    tid,fid 既然都是主键,则这句已经是最优的了。
      

  10.   

    执行计划看一下not exists
    explain select ...
    不会这么慢的。
      

  11.   

    SELECT tid FROM tb_a a 
    inner join tb_b b
    on fid=a.tid