mysql join 与 拆分成单表查询如何选择

参考以下文章,不错 

数据库联表查询时,是直接使用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好还是分别查询到数据后自己处理较好? - 知乎

mysql join 与 拆分成单表查询如何选择_第1张图片

 mysql join 与 拆分成单表查询如何选择_第2张图片

 mysql join 与 拆分成单表查询如何选择_第3张图片

 

你可能感兴趣的:(mysql,数据库,java)