假设存在product表
ID,NAME两列。ID为主键。现在数据库中有10万条记录,每天有10万条记录来更新,每条记录代表的是product。新的10万条记录中,有的product是数据库中不存在的,需要insert,有的product是已存在的,需要update,数据库中的有的product是不需要了,需要delete。如何完成操作最高效?目前的想法:
对于删除操作,
首先获取数据库中product的id,然后遍历新的所有product,将不存在的id对应的product从数据库中删除。删除操作先获得所有id,然后用DELETE FROM … WHERE … OR …以减少访问数据库的次数。
对于update和insert还没有想到什么太好的方法,也只能一条条记录来操作。不知道大家有没有什么好的建议?

解决方案 »

  1.   

    现有的数据在product表中,每天的这10万条从哪里来?也在另一张表中?还是其它什么系统每10秒钟送一条过来?
      

  2.   

    如果用MYSQL,id为主键,可以用
    insert into db1.tblOrder a select * from db2.tblOrder b on duplicate key update a.f1=b.f1;
      

  3.   

    MYSQL REPLACE
    REPLACE 的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
      

  4.   

    这里再细化下,新的10万条记录不是数据库中的另一个表,而是从某处读取,可以认为现在存在于内存中。REPLACE的性能如何?与从表中先获取已有的id,然后筛选出需要update和insert的记录再分别update/insert相比,REPLACE会性能更高吗?谢谢
      

  5.   


    这样的话,你原表中需要添加一个字段 FLAG int1. update product表 set FLAG=1;
    2. foreach (row in 内存)
    INSERT INTO product表 (id,name,flag) VALUES (1,2,0) ON DUPLICATE KEY UPDATE name=VALUES(name),FLAG=0;
    3. delete from product表 where FLAG=1;
      

  6.   

    REPLACE 等同于 INSERT ... ON DUPLICATE KEY UPDATE 
    效率上比你自己先判断再插入或更新要高。
    你可以参考一下手册中的详细说明
    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html