现在二千条记录,要插入到表tv_moble中,在插入记录时要与原表记录比较,号码重复的记录将不插入。
表tv_mobile原有二十万条记录;
要怎样来优化此查询呢。
我现在做的是每插一条数据,就与原有数据比较,如果重复就不插入,不重复就插入。可这样一来,速度很慢。

解决方案 »

  1.   

    MYSQL中直接使用 ON DUPLICATE KEY UPDATE13.2.4.2. INSERT DELAYED语法
    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
        [INTO] tbl_name [(col_name,...)]
        VALUES ({expr | DEFAULT},...),(...),...
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
      

  2.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  3.   

    谢谢楼上的回答。
    我的问题表述有误,应该是先跟表tv_mobile进行比较,然后将数据插入新表tv_mobile_new中,如果记录重复就不插入表tv_mobile_new中,如果不重复就插入。
    我现在的流程如下:
    1、先在表tv_mobile中查询是否有此记录,select * from tv_mobile where section = '手机号码' 如果存在,就不插入,如果不存在就执行insert into tv_mobile_new value(,,,...);
    2、现在存在的问题是在表tv_mobile中查询时时间过长。因为我要操作的数据有几千条,原表tv_mobile中有数据二十万条,我程序中用到的是循环操作,一条一条比较,再后再插入。
      

  4.   

    批量插入
    你是否可以先通过查询把二十万条记录需要的信息记录下来,再通过程序来去除相对应的记录,把没有重复的利用insert连接起来,批量插入,还有,你这里的二千条记录应该是在某一时刻去写入的,不会是无时无刻进入写入吧
      

  5.   

    呵呵,其实我说的就是这个问题的解决方案,你用一循环把需要所号码读取出来,放入数组,再利用程序来判断二千条数据里面哪些号码是存在于那个"数组"中的,把存在的全部去掉,然后再把剩余利用字串连接成一个SQL的插入字串,再运行, 这样你根本不需要循环二千次,也不用每一条与二十万条记录相比较,一次查询,一次写入就搞定了.祝你好运
      

  6.   

    说错了,应该是用一次SELECT查询从表中把二十万的条记录中的号码读取出来(这点建个索引,很快)
      

  7.   

    楼上的朋友。
    应该是用一次SELECT查询从表中把二十万的条记录中的号码读取出来,放入数组,再利用程序来判断二千条数据里面哪些号码是存在于那个"数组"中的。
    怎样让二行条记录跟原表一次性比较?
    不用循环.
      

  8.   

    是啊,不在mysql中作查询匹配。取出数据,用程序线下查询,在insert到数据库中。
      

  9.   

    if exists(select id from a where a.phonenum='123') then insert into b values ...
      

  10.   

    insert into @p_desctable(....)
      select ...
      from @p_srctable
      where updateBeginDate=@p_downdate and sequenceNumber=@p_downseq
      and not exists(select 1 from p_desctable d 
          where d.KeyField=p_srctable.KeyField);