所谓的n+1问题,举个例子,当你要查出一个列表数据的时候执行了一次sql查了一次数据库,而你还需要查到这个列表数据中每一条的关联信息,如果列表有n条数据,你就需要再查n次数据库,这样的话,效率就很低了,这个就是n+1问题,这还会导致分页的数据不对的问题。一下提供几条意见供参考:
-
使用懒加载。在未使用关联表数据时,可以让其在后面再加载出来,减轻服务器的压力。但是,如果一开始就需要关联表的数据信息,这个方法就不太适用了。
-
分批次查询。先查询出主表数据,然后根据主表数据进行筛选,取出关联表查询需要的字段,再统一一次查出所有关联的数据,最后使用java等高级语言对数据进行重新构造,得出最终数据,此时查询数据库次数为2。但是再java处理的部分会稍多一些。
-
不使用pagehelper分页,将页数和数量注入sql,sql编写的时候,先分页查出主表数据,再依次关联查询关联表的数据。这样就不会导致分页查询时,查出的数据条数不对等问题,只查一次数据库,执行效率也可以提高。比较推荐这种方式,详细可看https://blog.csdn.net/weixin_44919928/article/details/100043579