在java开发过程中我们经常会遇到这样的业务:我们需要查询多张表才能获取到自己所需要的所有字段和数据,一般而言我们有两种方式去解决这个问题,一种是直接多表联查,一种是每张表都去数据库查一次,一般人听到这两种方法肯定下意识的认为每张表都查一次需要建立多次链接并且对数据库压力也很大,肯定是一次全部查询出来更好啊。

其实不然,阿里发布的《java开发手册》中就明确指出禁止超过3表以上的join查询,如下图所示:

mysql 单表查询group by 速度优化 mysql单表查询性能_数据库

那么为什么阿里要做这样的限制?多表联查和单表多查哪个更好呢?

一、性能方面

首先,多表联查只需要去查询一次数据库就能获取到自己所需要的数据,减少了IO的开销,这是多表查询的一个巨大的优势。

于此相反的是,单表多查因为需要每次都去数据库查一张表的数据,因此IO开销比较大,不过对于一些常用的表数据可以通过缓存来解决每次去数据库查询的问题。

二、数据库压力

多表联查看起来只查询一次数据库,按理说应该对数据库压力比较小吧,但是事情远远不会那么简单。

  1. 多表联查会产生笛卡尔积现象,假如我要两表联查(一般都是小表驱动大表),每张表有十万数据,那么在没有建立索引的情况要获取结果需要查询100000*100000次,如果说数据级更大或者说再多联查几张表,那么实际的查询过程将呈几何成长,反观单表多查不会出现此类情况。
  2. 通常情况下我们进行多表查询的时候会建立索引以保证查询效率,这会产生另外一个问题--锁。当我们使用多表联查的时候,为了保证事务,数据库通常会对涉及的几张表进行加锁操作,这就导致其他操作会进入阻塞状态,加剧了数据库的压力。

三、难易程度

  1. 对于多表联查来说,需要自己写sql,还要加上各种条件,数据库方面还要加索引,还要保证字段类型相同,约束条件比较多,对于开发人员的要求也比较高。
  2. 反观单表多查,因为每次查询的sql只涉及一张表,甚至有些时候可以用generatorconfig生成的sql,因此相对多表联查来说比较简单,也不需要过多的考虑外键和索引,对于开发人员的要求比较低。

四、复用性

  1. 一般多表联查是为了实现某些特定的业务,因此复用性相对来说比较差。
  2. 单表多查是为了查询某张表的数据,只要涉及这张表的都可以使用,因此复用性比较高。

五、后期维护成本

  1. 多表联查的sql相对比较复杂,对开发人员要求比较高,如果联查多表,sql会非常的臃肿,后期维护的话也不太好维护,数据库方面对字段索引所求比较严格,改动起来比较麻烦,因此维护成本比较高。
  2. 单表多查都是一些相对比较简单的sql,对开发人员要求比较低,对数据库表要求也比较低,因此维护成本相对比较低。

六、总结

总结起来就是,多表联查开发人员要求比较高,对数据库压力也不低,操作起来比较繁琐,容易出现问题,复用性也不高,因此适用于数据量比较小,特定业务的场景

单表多查相对来说对开发人员和数据库层面要求比较低,也可以通过缓存也解决数据库IO压力,不太容易出现问题,后期维护成本也低,因此比较推荐使用