参考以下文章,不错
数据库联表查询时,是直接使用join好还是分别查询到数据后自己处理较好? - 知乎
一,声明
1,数据量
首先场景是多个表数据量比较大,可能达到百万级
2,结论:最好不要用join,用也不超过3张表。
推荐:代码 + 单表查询代替多join
即业务层处理,让sql变简单
二,使用单表查询理由
好维护,易优化,效率高,可复用
1.易读,相比多join,单表查询更容易理解,VS 不需要梳理复杂sql关系
2.易改/易维护,如果业务有变更,增减字段,或者查询数据逻辑有变,单个查询更容易维护,VS复杂sql,改动起来更复杂,更容易出错
3.易优化,更方便创建索引,explain分析更简单,更容易找出慢的原因,更容易优化 VS 复杂
4.可复用,单表查询,sql可复用 VS 不可复用
5.效率高,当数据量比大时,join效率下降比较厉害,join结果是表的笛卡尔积,检索是几何倍上升。
6.减少冗余字段查询,单表只查询一次,join会重复访问,m * n
7.分库分表,当需要分库分表是,夸库或分表,单表处理起来更容易,join实现起来比较复杂
8.锁竞争,可以减少锁竞争
三,业务层处理优势
易处理,可缓存
1.逻辑拆分,可以对数据库表进行拆分,高性能/好拓展,单表查询结果,再关联起来,相比复杂join,处理逻辑容易的多。
2.可缓存,有些数据可进行缓存,不用重复查库
3.IN()代替关联查询,查询本身效率也可能会有所提升。查询id集的时候,使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效
四,join优势
1.join分页比较容易,单表查询,对于总结果分页,需要手动分页
五,思考
1.业务层数据量问题,当表的量比较大,比如到达十万,百万级,又需要全量查询时,把所有数据都查询出来,会导致什么问题?如下
【内存溢出问题】实际开发中,一次从数据库取出过多数据,导致内存溢出问题_一次性从数据库中读取数据过多_CookieOrYou的博客-CSDN博客
处理方案
分页处理,对基础表查询时进行分页,然后取条件作为后续子查询条件,避免一次读取大量数据
2.大量join查询,执行太久,对数据库的影响,会拖垮数据库吗?
六,参考文档,这边文章不错
数据库联表查询时,是直接使用join好还是分别查询到数据后自己处理较好? - 知乎