有两个表,一个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查询压力。但感觉这样工程似乎太大了。我只不过就是比较两张表而已嘛
字段有:
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查询压力。但感觉这样工程似乎太大了。我只不过就是比较两张表而已嘛
CityCode name address
110000 北京市XX有限公司 海淀南路113-1号
110000 北京XX公司 海淀南路113-1
重复的:
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
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
...以上两条数据可以认为是相同的。
from t1 left join t2 where t1.name=t2.name
用id区分每次执行的数据一批批处理比较还有你使用的mysql_query会将整个数据集缓存存入内存中,占用资源 建议改为mysql_unbuffered_query