主题
面试速答(先看这里)
**一句话结论:**这是一个比较常见的典型的性能优化的场景题,并且问的并不算难,因为他限定了前端页面、Java后台、数据库,而且还说了数据库是单表。
60秒标准回答:
这是一个比较常见的典型的性能优化的场景题,并且问的并不算难,因为他限定了前端页面、Java后台、数据库,而且还说了数据库是单表。那也就意味着我们不用考虑太多的分布式系统、分库分表等带来的影响了
那么,分别从三个方面该如何优化呢?
百万级数据,肯定不能一页就查询出来,所以肯定要 分页查询 。另外,建议页面上增加滚动加载或者下拉加载的效果,一方面提升用户的体验,另外也能避免跳页查询,能够更好地解决深分页的问题
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**百万级数据,肯定不能一页就查询出来,所以肯定要 分页查询 。
- **要点2:**除了分页以外,还需要提供 关键词搜索、过滤条件、排序选项 ,总之就是避免用户全量查询。
- **要点3:**前端排序 ,对于有一些数据如果需要在当前页排序的话,完全可以用前端排序代替后端排序,这样不仅能减少多次查询请求,还能更快的实现排序。
- **要点4:**首先 分页查询 的问题还是要的,后端也要做些控制,比如限制最大的pageSize,避免无条件的全表查询等。
- **要点5:**接着就是可以考虑做一些 缓存 ,针对一些变化不频繁地热点数据,可以考虑在Redis或者本地做一层缓存,减少对数据库的查询,来提升性能。
**记忆锚点:**Future → 分页查询 → 前端缓存 → Java → join → 关键词搜索过滤条件排序选项
关键取舍:
- 这是一个比较常见的典型的性能优化的场景题,并且问的并不算难,因为他限定了前端页面、Java后台、数据库,而且还说了数据库是单表。
- 首先 分页查询 的问题还是要的,后端也要做些控制,比如限制最大的pageSize,避免无条件的全表查询等。
- 接着就是可以考虑做一些 缓存 ,针对一些变化不频繁地热点数据,可以考虑在Redis或者本地做一层缓存,减少对数据库的查询,来提升性能。
易错提醒:
- 百万级数据,肯定不能一页就查询出来,所以肯定要 分页查询 。
- 另外,建议页面上增加滚动加载或者下拉加载的效果,一方面提升用户的体验,另外也能避免跳页查询,能够更好地解决深分页的问题。
加分表达:
- 除了分页以外,还需要提供 关键词搜索、过滤条件、排序选项 ,总之就是避免用户全量查询。
追问准备:
- 围绕「Future」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「分页查询」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「前端缓存」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
这是一个比较常见的典型的性能优化的场景题,并且问的并不算难,因为他限定了前端页面、Java后台、数据库,而且还说了数据库是单表。那也就意味着我们不用考虑太多的分布式系统、分库分表等带来的影响了。
那么,分别从三个方面该如何优化呢?
前端
百万级数据,肯定不能一页就查询出来,所以肯定要分页查询。另外,建议页面上增加滚动加载或者下拉加载的效果,一方面提升用户的体验,另外也能避免跳页查询,能够更好地解决深分页的问题。
除了分页以外,还需要提供关键词搜索、过滤条件、排序选项,总之就是避免用户全量查询。另外在输入框中加防抖的功能,减少频繁请求,比如一定要点击查询按钮才发起请求。
前端排序,对于有一些数据如果需要在当前页排序的话,完全可以用前端排序代替后端排序,这样不仅能减少多次查询请求,还能更快的实现排序。
还有就是前端也是可以作缓存的,对查询频繁的下拉框、静态表单选项等做前端缓存或预加载。
Java代码
首先分页查询的问题还是要的,后端也要做些控制,比如限制最大的pageSize,避免无条件的全表查询等。
接着就是可以考虑做一些缓存,针对一些变化不频繁地热点数据,可以考虑在Redis或者本地做一层缓存,减少对数据库的查询,来提升性能。
异步处理+预读,对于查询可能会耗时的操作了 ,可以提前通过Future异步的方式查询,然后主线程继续执行其他的代码,当需要这些数据的时候,再从Future中取出数据,这样也能提升一定的效率。
📄 ✅如何在 Java 中实现高效的异步编程?如何避免回调地狱?
打开文档:✅如何在 Java 中实现高效的异步编程?如何避免回调地狱?
数据库优化
这就是核心的了,但是其实百万级数据,还是比较好优化的,主要就是考虑索引、避免多表join、避免深分页、减少Select *等几个方面。
因为百万级数据完全没必要上读写分离、分库分表这些,只要把索引弄好,没有join,没有深分页也就够了。
索引:
join:
深分页:
select * :