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