有两个表,一个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万条数据需要很长时间
(我通过多进程来分工,每个进程处理几百万数据,开始还很快每秒能处理1000多条数据,到后来mysql就负荷比较大,运行了15个小时才处理了120几万数据)。
各位给些意见,不知道还有其他方法比较两张表没有????
听说memcache能把mysql数据分布式的保存到多个机器的内存,读内存快得多,缓解了msyql查询压力。但感觉这样工程似乎太大了。我只不过就是比较两张表而已嘛

解决方案 »

  1.   

    不是简单的在select语句中用 =、<,> like之类就可以解决的匹配的,要实现地名匹配,所以我自己实现了一个匹配函数。
      

  2.   

    其实还有个CityCode字段,这个字段是建立了索引的。以下两条记录可以认为是重复的:
    CityCode    name                   address
    110000      北京市XX有限公司    海淀南路113-1号
    110000      北京XX公司          海淀南路113-1
      

  3.   

    假设以CityCode为KEY字段
    重复的:
    select * from t1 a inner join t2 b on a.CityCode=b.CityCode
    不重复的:
    select t1.* from t1 left join t2 b on a.CityCode=b.CityCode where b.CityCode is null
    or
    select t2.* from t1 right join t2 b on a.CityCode=b.CityCode where a.CityCode is null
      

  4.   

    所有字段都要匹配啊 不只是CityCode. name,address可没CityCode容易比较。你命令是不是写错了啊  怎么mysql提示"Column 'name' in feild list is ambiguous"
      

  5.   

    我把两个表具体列出来把
    T1  1400万 CityCode建立了索引
    CityCode   name                  Address          x            y
    ...
    110000     北京市XX有限公司      海淀南路113-1号   116.123456   26.123456
    ...
    T2  800万   city_code建立了索引
    city_code   name             address           longitude   latitude
    ...
    110000      北京XX公司       海淀南路113-1      116.123456   26.123456
    ...以上两条数据可以认为是相同的。
      

  6.   

    select t1.*, if(isnull(t2.name),'不重复','重复')
    from t1 left join t2 where t1.name=t2.name
      

  7.   

    用inner join把两个表内联一下啊 
      

  8.   

    上千万的数据这样查,肯定慢,还会占用资源,锁住很多数据,最好使用切分处理
    用id区分每次执行的数据一批批处理比较还有你使用的mysql_query会将整个数据集缓存存入内存中,占用资源 建议改为mysql_unbuffered_query