一道朋友分享的关于mysql的面试题
加一张所谓的"海量数据"的图(例子里为了速度没有选这么大的表)
---------------------------------------------本想比较下Oracle下 @灵剑@呵呵一笑百媚生 的self join, 和rank()的性能对比......结果....由于公司已经大量使用NoSQL替换RDBMS(或者使用更侧重scalability的内部RDBMS),找了一天居然没有在DataWarehouse里找到满足问题条件的表! 找到的类似的表都木有索引(因为毕竟DW都是Hash Join, 各种partition scan,只要partition分好就OK), 所以只能测试下无索引状态下的性能对比 (摊手)这个无索引的对比的意义在于以下事实:0. 日志表一般都是海量数据。1. 海量数据下做join,Optimizer 倾向于使用Hash Join, 而不用Nest Loop2. Hash Join一般无法使用Join column上的索引下边是Explain Plan\u0026lt;1\u0026gt;Self Join, 使用的是 @呵呵一笑百媚生 答案中的query版本
\u0026lt;2\u0026gt;Rank 版本
【一道朋友分享的关于mysql的面试题】
可以看到cost(最右边的数字)的差距还是有一些的。。。------------------------------------------------------------自己的锅自己补, 查了下 stack overflow,把答案补全吧,oracle - Rank function in MySQL with Order By clause话说, MySQL什么时候可以来到21世界啊。。。。-------------------------------------------------------------oh, MySQL,使用一个ranking variable,旁边的DE不耐烦的说…至于怎么partition 我就不敢再问了…———————————————————With ranked as ( Select userId, time, content, rank() over (partition by userId order by time desc) as rank from LOG )Select userId, time, content from ranked where rank \u0026lt; 很普通的查询要求 , 数据库保证只会做一次全表扫描,想取前几把n替换成不同的数就行了, 坐我旁边的数据工程师(Data Engineer)如是说。
■网友SELECT *FROM (SELECT a.*, (CASE a.userid WHEN @uid THEN @rank:=@rank + 1 ELSE @uid:=a.userid END) AS temp_rank FROM log a, (SELECT @rank:=1, @uid := -1) b ORDER BY createtime DESC) cWHERE temp_rank \u0026lt; 4受邀回答,一进来就看到了@阿莱克西斯 的答案,好在他用的是Oracle,这就给了我一个补充回答的机会。这里假定user id 是int类型。如果数据量过大的话,或者假定最终的结果总会出现在最新的1000行或者更极致的10行以内的话。不妨用一个log表的子查询+排序代替现在a。SELECT *FROM (SELECT a.*, (CASE a.userid WHEN @uid THEN @rank:=@rank + 1 ELSE @uid:=a.userid END) AS temp_rank FROM (SELECT * FROM log ORDER BY createtime DESC LIMIT 1000 ) a, (SELECT @rank:=1, @uid := -1) b -- ORDER BY createtime DESC ) cWHERE temp_rank \u0026lt; 4//-------感谢@呵呵一笑百媚生 的提醒,修改了一个笔误。既然有了讨论,就回头谈谈题目吧。首先,尽管没听说会有人建表的时候连主键都不设置,但作为一个题目,我们就假定它就是没有主键。就像没有必要问小明为什么进水排水一起开一样。接着是没有说明是表的容量大小,既然说了是日志表,只能假定是长表。每一行记录都会触发子查询的方法在长表中不可取(@灵剑关心的性能问题:5.7在一个类似结构的330+万记录数据库中得出的结果是350秒以上,此方法的时间可以控制到10秒内,而优化版本可以控制到0.1秒以下,好吧,createtime加了索引)。接着就是索引,没提到任何索引,甚至连主键都不存在,也就只能假定没有任何索引。
推荐阅读
- 朋友圈直播酒驾全过程?警方:当事人涉嫌酒驾接受调查
- 警方:锦江学院2死者系男女朋友关系男子杀人后跳楼
- 为啥到现在你还没有女朋友 ?
- 微博目前已经支持文本,图片,位置分享,为啥没有语音和视频呢微博的pm肯定想过这两种微博形态,但迟迟不做的原因到底是啥。是语音和视频不符合产
- 朋友圈权限被破解,怎样反破解
- 深圳奔之升BBA|20款奔驰A200升级原厂盲点辅助 自适应巡航ACC案例分享
- 为啥和自己接触过的女孩子都很快就有男朋友了啊
- 文案|适合十一月发朋友圈的心情文案2020只剩2个月
- 汽车知识|外观时尚开着出门面子足!风光500车主用车200公里口碑分享
- 为啥dropbox 分享占据所有分享人员的空间并让所有人拥有修改权限
