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

比较两个数据库记录
有两个表,一个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解决方法:
SQL code

--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)