【面经】面试官,最新Java开发进阶

文章探讨了在MySQL中高效查询大数据表的随机记录方法,包括使用ORDERBY+LIMIT、JOIN避免排序、以及设计模式在代码可读性和维护性中的作用。还提到了设计思想解读开源框架如Spring和MyBatis的过程。
摘要由CSDN通过智能技术生成

面试题目


如何从MySQL一个数据表中查询一条随机的记录,同时要保证效率最高。

从这个题目来看,其实包含了两个要求,第一个要求就是:从MySQL数据表中查询一条随机的记录。第二个要求就是要保证效率最高。

接下来,我们就来尝试使用各种方式来从MySQL数据表中查询数据。

方法一


这是最原始最直观的语法,如下:

SELECT * FROM foo ORDER BY RAND() LIMIT 1

当数据表中数据量较小时,此方法可行。但当数据量到达一定程度,比如100万数据或以上,就有很大的性能问题。如果你通过EXPLAIN来分析这个 语句,会发现虽然MySQL通过建立一张临时表来排序,但由于ORDER BY和LIMIT本身的特性,在排序未完成之前,我们还是无法通过LIMIT来获取需要的记录。亦即,你的记录有多少条,就必须首先对这些数据进行排序。

方法二


看来对于大数据量的随机数据抽取,性能的症结出在ORDER BY上,那么如何避免?方法二提供了一个方案。

首先,获取数据表的所有记录数:

SELECT count(*) AS num_rows FROM foo

然后,通过对应的后台程序记录下此记录总数(假定为num_rows)。

然后执行:

SELECT * FROM foo LIMIT [0到num_rows之间的一个随机数],1

上面这个随机数的获得可以通过后台程序来完成。此方法的前提是表的ID是连续的或者自增长的。

这个方法已经成功避免了ORDER BY的产生。

方法三


有没有可能不用ORDER BY,用一个SQL语句实现方法二?可以,那就是用JOIN。

SELECT * FROM Bar B JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Bar) AS m ON B.ID >= m.ID LIMIT 1;

此方法实现了我们的目的,同时,在数据量大的情况下,也避免了ORDER BY所造成的所有记录的排序过程,因为通过JOIN里面的SELECT语句实际上只执行了一次,而不是N次(N等于方法二中的num_rows)。而且, 我们可以在筛选语句上加上“大于”符号,还可以避免因为ID好不连续所产生的记录为空的现象。

在MySQL中查询5条不重复的数据,使用以下:

SELECT * FROM table ORDER BY RAND() LIMIT 5

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!

054458)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-9qCd4MYM-1711019054459)]

搜集费时费力,能看到此处的都是真爱!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值