✅有一张上百万条数据的单表,从前端页面、Java后台、数据库三个层面做查询优化

✅有一张上百万条数据的单表,从前端页面、Java后台、数据库三个层面做查询优化

典型回答

这是一个比较常见的典型的性能优化的场景题,并且问的并不算难,因为他限定了前端页面、Java后台、数据库,而且还说了数据库是单表。那也就意味着我们不用考虑太多的分布式系统、分库分表等带来的影响了。

那么,分别从三个方面该如何优化呢?

前端

百万级数据,肯定不能一页就查询出来,所以肯定要分页查询。另外,建议页面上增加滚动加载或者下拉加载的效果,一方面提升用户的体验,另外也能避免跳页查询,能够更好地解决深分页的问题。

✅MySQL的深度分页如何优化

除了分页以外,还需要提供关键词搜索、过滤条件、排序选项,总之就是避免用户全量查询。另外在输入框中加防抖的功能,减少频繁请求,比如一定要点击查询按钮才发起请求。

前端排序,对于有一些数据如果需要在当前页排序的话,完全可以用前端排序代替后端排序,这样不仅能减少多次查询请求,还能更快的实现排序。

还有就是前端也是可以作缓存的,对查询频繁的下拉框、静态表单选项等做前端缓存或预加载。

Java代码

首先分页查询的问题还是要的,后端也要做些控制,比如限制最大的pageSize,避免无条件的全表查询等。

接着就是可以考虑做一些缓存,针对一些变化不频繁地热点数据,可以考虑在Redis或者本地做一层缓存,减少对数据库的查询,来提升性能。

异步处理+预读,对于查询可能会耗时的操作了 ,可以提前通过Future异步的方式查询,然后主线程继续执行其他的代码,当需要这些数据的时候,再从Future中取出数据,这样也能提升一定的效率。

✅如何在 Java 中实现高效的异步编程?如何避免回调地狱?

数据库优化

这就是核心的了,但是其实百万级数据,还是比较好优化的,主要就是考虑索引、避免多表join、避免深分页、减少Select *等几个方面。

因为百万级数据完全没必要上读写分离、分库分表这些,只要把索引弄好,没有join,没有深分页也就够了。

索引:

✅索引失效的问题是如何排查的,有哪些种情况?

✅为什么MySQL会选错索引,如何解决?

✅设计索引的时候有哪些原则(考虑哪些因素)?

✅SQL执行计划分析的时候,要关注哪些信息?

join:

✅为什么大厂不建议使用多表join?

✅什么是数据库范式,为什么要反范式?

深分页:

✅MySQL的深度分页如何优化

select * :

✅为什么要尽量避免使用select * ?