日期:2014-05-17  浏览次数:20449 次

比较两个数据库记录
有两个表,一个T1 1400万条记录,一个T2 800万数据。
字段有:
name,address,longitude,latitude

现在我要从T1中选出T2中重复的 和不重复的。

用程序怎么实现效率高?  

const char* sql = "select name,address,longitude,latitude from T1";
const char* sql2 = "select name,address, longitude, latitude from T2";
MYSQL mysql;
MYSQL_RES *res,*res2;

mysql_init(&mysql);
mysql_real_connect(...);
mysql_query(&mysql,sql,NULL,0);
res = mysql_store_result(&mysql);
while(row=mysql_fetch_row(res))
{
      mysql_query(&mysql,sql2,NULL,0);
      res2 = mysql_store_result(&mysql);
       
      while(row=mysql_fetch_row(res2))
      {
             ...//作比较
      }
      mysql_free_result(res2);    
}
mysql_free_result(res);


可是红色部分耗时比较长啊(不停的提交select请求),导致扫描1400万数据需要很长时间。
各位给些意见,不知道还有其他方法比较两张表没有????

------解决方案--------------------
存储过程实现,把问题都交给数据库吧,没理由在前台用循环,这是个致命的思路
不管你是mysql还是MSSQL,肯定都不可取
------解决方案--------------------
--选择不重复的
select *  from T1 except select * from T2

select *  from T1 where not exists (select 1 from T2)


--选择重复的
select * from T1 where exists (select * from T2)


select * from T1 where T1.主键 in (select 主键 from T2)
------解决方案--------------------
引用:
程序?你用sql不是更好吗?sql本来就是用来实现这些操作的,你用循环只能一条一条处理。会死人的哦

++
------解决方案--------------------
MSSQL解决方法:

--T1中选出T2中重复的
SELECT * FROM T1 WITH(NOLOCK)
INTERSECT
SELECT * FROM T2 WITH(NOLOCK)

--T1中选出T2中不重复的
SELECT * FROM T1 WITH(NOLOCK)
EXCEPT
SELECT * FROM T2 WITH(NOLOCK)