• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

【100分】金山面试题,该怎么解决

mysql 搞代码 7年前 (2018-06-05) 128次浏览 已收录 0个评论

【100分】金山面试题
题目如下:
数据库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)
——解决方案——————–
数据量很大的话用临时表处理就可以了。
——解决方案——————–

探讨

引用:
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类数据.u……

——解决方案——————–
1)各位高手能否说一下这道题的考点是什么

题目没有说明 2个数据库是否在同一机器上,如不在,要用到
FEDERATED 存储引擎

对大数据量的操作

2)能否说一下你们的实现思路或者关键的sql语句
可以用merge 存储引擎为实现
OR
EXISTS、UNION来实现

——解决方案——————–
小菜鸟也插句嘴,如果数据量很少 1类的嵌套可以,
如果数据量较大,那就用临时表吧
create temprary table tem_id(id int)
insert into tem_id select id from 库2.table1
insert ignore into tem_id select id from 库2.table2
……
insert into tem_id select id from 库2.table12
select count(*) from 库1.table a inner join tem_id b on a.id=b.id
呵呵 我还没接触跨DB 操作 假想都是在一耳光服务器上
——解决方案——————–
都是高手呀,咋就我一個菜呢
——解决方案——————–
也许按userid进行join union到临时表会更好点?
——解决方案——————–
我不知道.
——解决方案——————–
用hash表。大数据处理一般把需要的数据一下子找出来放到内存,在内存中处理,如果用表连接得处理到何年何月,反正现在的内存都白菜价了
——解决方案——————–

探讨

引用:

引用:
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 user……

——解决方案——————–
这个问题我们也遇到过,我们的解决方法是:建立一张用户表,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左右的数据。我们是把原始数据和计算过的业务数据分离的思路来实现的。。。希望对你有帮助。
——解决方案——————–
如果数据量非常大的话,还硬要在数据库处理,就有点缘木求鱼的感觉了。
放入hadoop处理。哈哈。
——解决方案——————–

探讨

引用:
引用:

引用:

引用:
select count(*) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2……

——解决方案——————–
也来吐槽一个不成熟的建议,可以把数据库2中表的userid存到物化视图里,然后两个数据库做连接查询
——解决方案——————–


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【100分】金山面试题,该怎么解决

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址