为什么强烈推荐你使用单表查询?(续篇)

简介: 为什么强烈推荐你使用单表查询?(续篇)

在昨天的文章《为什么强烈建议你不要做联表查询?》中,大家提了一些比较有意义的问题,留言回复说不太清楚,今天单开这一篇做一些说明。


首先,在实际开发中,还是应该多使用单表查询,这样无论在性能上或者后续维护上,都会比复杂的关联查询要好,很多高性能的应用都会对关联查询进行分解。但是针对一些不同的场景,也应该比较灵活的采取join查询的方法,原则上join不要超过三张表。


数据库连接次数过多,效率更低


image.png


单表查询势必要考虑2次连接带来的开销,但是,MySQL对连接/断开是有处理的,而且网络越来越快,相比单表查询能够让缓存效率更高的这个优势下,多两次的连接所带来的开销基本可以忽略不计。(指一般业务下,具体问题还要具体分析)


多条件过滤+分页难实现


image.png


这里贴一个代码片段


image.png


无论是哪个表需要传参查询,最终都有一个符合条件的结果集,最终我们组合查询后的结果集,多条件过滤无法实现的问题就不存在了。至于分页,使用 com.baomidou.mybatisplus.core.metadata包下的IPage,很强大,谁用谁知道!


附代码:


public PageResult<ApplyVO> searchApplyPage(Page<Apply> page, Integer approvalStatus, String proposerCard, String message){
        List<Long> ids = Optional.ofNullable(this.applyMapper.findMedicineApplyIds()).orElse(new ArrayList<>()).stream().map(Apply::getId).collect(Collectors.toList());
        List<ApplyVO> applyVOS = Lists.newArrayList();
        if(CollectionUtils.isEmpty(ids)){
            return PageResult.of(applyVOS,0);
        }
        Page<Apply> apps = this.applyMapper.selectPage(page, new QueryWrapper<Apply>().lambda()
                .in(Apply::getId,ids)
                .eq(!Objects.isNull(approvalStatus), Apply::getApprovalStatus, approvalStatus)
                .eq(!StringUtils.isEmpty(proposerCard), Apply::getProposerCard, proposerCard)
                .and(!StringUtils.isEmpty(message), i-> i.like(Apply::getTeamName, message).or()
                        .like( Apply::getProposer, message).or()
                        .like(Apply::getAthleteName, message)).orderByDesc(Apply::getApprovalNumber)
        );
        apps.getRecords().forEach(s->{
            List<MedicineDetail> medicineDetails = this.detailMapper.selectList(new QueryWrapper<MedicineDetail>().eq("apply_id", s.getId()));
            MedicineApplyVO medicineApplyVO = MedicineApplyVO.builder().accompany(s.getAccompany()).medicineDetails(medicineDetails).build();
            applyVOS.add(medicineApplyVO);
        });
        return PageResult.of(applyVOS,apps.getPages(),apps.getCurrent(),apps.getCurrent(), apps.getTotal());
    }


排序分页不同表的问题



image.png


这种,不考虑,直接join查询,数据组装或许能实现,但是没必要搞这么复杂,推荐大家使用分表查询,但不是所有的都必须分表,一看就是联表更方便的,我们一般都直接联表写SQL。


基本都解答完了,对于一头磕在键盘上的同学的留言,说的完全有道理,虚心接受,上一篇文章其实主要是推荐大家在开发中尽量使用单表查询,单表查询优点>缺点,既然是鼓动大家使用单表查询,我必然是介绍它的优点,哈哈。


但是在实际开发中,一些场景明显使用联表查询更方便,我也会去使用联表的方式,比如多喝热水同学的留言问题,不用考虑,直接联表查。


END


相关文章
|
存储 关系型数据库 MySQL
MySQL基础详讲(高级部分)
MySQL是一种关系型数据库管理系统(RDBMS),它是一种开源数据库软件,广泛用于Web应用程序的开发和数据存储
94 3
|
6月前
|
SQL 关系型数据库 MySQL
MySql基础四之【终篇复杂查询】
MySql基础四之【终篇复杂查询】
94 0
|
7月前
|
存储 缓存 关系型数据库
mysql优化指南之原理篇
MySQL的其原理,如存储引擎、SQL执行流程和关键字执行顺序,以及如何正确使用索引、连接池和数据库部署方式,都是至关重要的。此外,硬件资源的合理利用,如CPU、内存、硬盘和网络,也直接影响数据库的性能。
81 2
|
7月前
|
存储 小程序 前端开发
前端知识笔记(四十六)———什么是小程序,什么是数据库
前端知识笔记(四十六)———什么是小程序,什么是数据库
58 0
|
SQL 存储 缓存
Mysql优化高级篇(全)
目录前言1. 简介1.1 安装1.2 MySQL逻辑架构存储引擎2. 索引优化分析2.1 原因2.2 常见通用的join查询2.3 索引2.3.1 索引分类2.3.2 索引结构2.3.3 索引情况2.4 性能分析2.4.1 id 前言 本篇文章主要涉及mysql的高级篇,主要是mysql的架构介绍、索引优化分析、查询截取分析、mysql锁机制以及主从复制等 在这之前的学习可参考我之前的文章进行学习 数据库知识 链接 数据库查询常用语句语法 博客链接 数据库中增删改常用语法语句(全) 博客
78552 19
Mysql优化高级篇(全)
|
SQL 数据库
学通4中数据库SQL教程练习和答案
编写一个SQL语句,输出下面的结果
121 0
|
SQL Oracle 关系型数据库
MySQL基础学习(三)
在实际开发中不建议,可以自己玩没问题。 你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。
171 0
MySQL基础学习(三)
|
SQL 存储 关系型数据库
MySQL基础学习(二)
指令通过客户端命令终端发出,数据库管理系统中通过mysqld.exe监听端口接收命令,数据库管理系统把按指令获得的信息返回去,最后客户端把返回来的信息显示出来
134 0
MySQL基础学习(二)
|
SQL Oracle 关系型数据库
SQL基础入门
MySQL是一个关系型数据库管理系统 前世:瑞典MySQLAB公司 今生:属于Oracle旗下产品 MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之一。 开软的数据库软件~ 体积小、速度快、总体拥有成本低,招人成本较低,所有人必须会 中小型网站、或者大型网站,集群! SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言,但是它有很多不同的实现版本。
SQL基础入门
|
SQL 存储 关系型数据库
Mysql数据库基础第二章:(八)子查询经典案例
子查询作为该系列第二章较难的一部分,需要有一定的思考分析。因此,本文找了一些经典的子查询案例,并写了相应的思路分享给大家。