现在我有两个表,其中一个表(A)的数据大概有一千多万,而另一个表(B)的数据大概有三千万,现在需要在B表中删除与A表相关联的数据 ,SQL应该怎么写执行速度最快?普通的delete語句执行了三个小时只删除一小部分数据  我写的SQL如下:
delete  B from B,A where B.accountid=A.accountid;

解决方案 »

  1.   

    delete B from B
    where exists (select 1 from A where B.accountid=A.accountid);
      

  2.   

    delete  B from B,A where B.accountid=A.accountid;
    这个写法已经无可挑剔了。 关键是看一下你的索引都建了没有。A,B表上针对列accountid的索引。
      

  3.   

    借用楼主的贴子发个问题。
    我想在执行插入语句,然后执行select last_insert_id()这两步之前将select last_insert_id()置空,请问各位大侠如何实现?
      

  4.   

    这个大量删除就是这么慢 可以尝试分批删除delete B from B,A where B.accountid=A.accountid limit n;
    这里的n表示你每次删除的记录数
      

  5.   


    赶紧去试试这个,我把limit写中间了,报错。我是想过这个方法....
    写个存储过程循环执行吧。明天试试给各位结果哦
      

  6.   

    4楼的方法执行报错....从 MySQL 4.0 开始,在 DELETE 语句中可以指定多个表,用以从一个表中删除依赖于多表中的特殊情况的记录行。然而,在一个多表删除中,不能使用 ORDER BY 或 LIMIT。
      

  7.   

    在accountid上建立索引没有,直接生成新表试试
    create table newtt as
    select b.* from b left join a on a.accountid=v.accountid where b.accountid is null
      

  8.   


    呵呵,帅哥,exists 是非常慢的哦。
      

  9.   


    都是MyISAM 引擎。。
    还没解决办法,急啊
      

  10.   

    表(A)的数据大概有一千多万,而另一个表(B)的数据大概有三千万
    这么大,  limit 100,0000  这样删除 否则这操作哦会锁表
      

  11.   

    建索引create TEMPORARY table xx
    select b.* from b left join a where A.accountid is null;
    truncate table b;
    insert into b
    select * from xx
      

  12.   

    上面 join 后面多了个a,手误
      

  13.   

    呵呵,各位大侠久等了啊,我自己已经做出来了是用的存储过程写的 发现每次直接LIMIT 三千万条数据的时间最短。大概40分钟。15楼的我要试下,操作临时表的效率和操作数据表的的效率不在一个级别上,可以试试的