参考论坛:http://topic.csdn.net/u/20120820/23/C6B16CCF-EE15-47C0-9B15-77497291F2B9.html
数据库1中存放着a类数据,数据库2中存放着以天为单位划分的表30张(比如table_20110909,table_20110910,table_20110911),总共是一个月的数据。表1中的a类数据中有一个字段userid来唯一判别用户身份,表2中的30张表(每张表结构相同)也有一个字段userid来唯一识别用户身份。如何判定a类数据库的多少用户在数据库2中出现过?
1)各位高手能否说一下这道题的考点是什么
2)能否说一下你们的实现思路或者关键的sql语句
二、
法一:
select count(*) from 数据库1.a类数据 where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid) or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.userid) or exists (select 1 from 数据库2.table_20110911 where userid = 数据库1.a类数据.userid)
法二:
由于法一不适合在数据量很大的情况,帮采用临时表的思路
就是把每天的表的userid提取出来 到一张userid表
create table userid(userid int primary key)
每天凌晨的时候执行
insert ignore into userid select count(distinct userid) from 数据库2.table_2011xxxx;
然后在用法一去userid这个表匹配
法三:
2个数据库是否在同一机器上,如不在,要用到FEDERATED 存储引擎。
法四:
用hash表。大数据处理一般把需要的数据一下子找出来放到内存,在内存中处理,如果用表连接得处理到何年何月,反正现在的内存都白菜价了。
法五:
我们的解决方法是:
建立一张用户表,UserInMonth(userid)表里面只放不重复的用户Id;把(table_20110909,table_20110910,table_20110911)的用户Id放到一张User表里面userid都统一放到这个表里面去。
判断的时候select count(1) from user u inner join UserInMonth um on u.userid=um.userid.至于数据可以用存储过程,或者一些数据仓库的用具。
另外说一点,把表拆分的每日一张表,就是因为数据量比较大。。。我以前做一个GPS项目的时候,也是这么做的,每天一张表,一张表5G左右的数据。我们是把原始数据和计算过的业务数据分离的思路来实现的。。。希望对你有帮助。