为什么强烈建议你不要做联表查询?

简介: 为什么强烈建议你不要做联表查询?

前言


一直想要聊一聊关于开发中更建议使用单表查询+代码层组装 or 联表查询 的问题,在开发中每个同学的开发中有各自的习惯,笔者在公司也和一些同事关于这方面有一些探讨。


关于本文,更像是一些个人的看法,想到什么说什么,一定有不同的意见,欢迎大家留言,一起讨论。


对比


在实际开发中,我们不可避免的要关联几张数据表来合成最终的展示数据,如:


select * from tag
join tag_post on tag_post.tag_id=tag.id
join post on tag_post.post_id=post.id
where tag.tag='mysql';


同样的,我们可以用以下查询来代替:


select * from tag where tag='mysql';
select * from tag_post where tag_id=1234;
select * from post where id in(123,456,567,9989,8909);


看似后者查询步骤更多了,原本一个方法查询就能出结果,现在直接变成三个。但是这样做的好处是:


1、单表查询更利于后续的维护。


在实际开发场景中,在代码初步开发阶段(如果摊上一个不太靠谱的产品),业务发生变动,某张表的结构发生变动,很可能整个join查询都变得不可用,复杂的关联查询,在修改时,基本等于推倒重来。


但是如果我们使用了单表查询,拆成上诉例子中的三个步骤,我们可能只需要修改其中的一个步骤即可,比较利于维护。


2、代码可复用性高


这个不用多说,join联表的SQL,基本不太可能被复用,但是拆分后的单表查询,比如上面例子中,我查询出tab数据,任何地方组装需要tab数据,我都不需要再次做相关查询,直接使用。


3、效率问题


join联表查询,小表驱动大表,通过索引字段进行关联。如果表记录比较少的话,效率还是OK的,有时效率超过单表查询。但是如果数据量上去,多表查询是笛卡尔乘积方式,需要检索的数据是几何倍上升的。另外多表查询索引设计上也考验开发者的功底,索引设计不合理,大数据量下的多表查询,很可能把数据库拖垮。


相比而言,拆分成单表查询+代码上组装,业务逻辑更清晰,优化更方便,单个表的索引设计上也更简单。用多几行代码,多几次数据库查询换取这些优点,还是很值得的。


4、减少冗余字段的查询


在很多业务中,我们可能对某条记录只需要查询一次,此时如何使用关联查询,则不可避免的需要重复地访问一部分数据,从而可能会加剧网络和内存的消耗。


5、缓存利用率更高


比如上面查询中的tag是不常变动的数据,缓存下来,每次查询就可以跳过第一条查询语句。而关联查询,任何一张表的数据变动都会引起缓存结果的失效,缓存利用率不会很高。


6、其他


数据库资源比较宝贵,很多系统的瓶颈就在数据库上,很多复杂的逻辑我们在Service做,不在数据库处理会更好。


在后续数据量上去,需要分库分表时,Join查询更不利于分库分表,目前MySQL的分布式中间件,跨库join表现不良。


单表查询+代码上组装相当于解耦,现在开发中,我们常常使用各种ORM框架,不知道你的联查orm给你搞成了什么样,你是很难直接优化。


以上理由,强烈推荐在今后的开发中,尽可能的使用单表查询+代码上组装的方式。使用Stream lambda + mybatis plus + lombok, 酸爽!


单表 VS 联表


image.png


image.png


基本就这些了,你的看法呢?


目录
打赏
0
0
0
0
23
分享
相关文章
分析索引失效的几种情况
联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
117 1
|
9月前
|
11. 知道什么是回表查询嘛 ?
了解回表查询吗?当对表的`name`字段建立索引后,执行`SELECT name,age FROM user WHERE name='Alice'`,数据库首先通过索引找到主键`id=18`,然后依据主键在主索引中获取完整数据记录,这个过程称为回表查询。由于需两次查找,其性能低于直接扫描索引树。
78 0
索引失效的情况分析
大家都知道,一条查询语句走了索引和没走索引的查询效率是非常大的,在我们建好了表,建好了索引后,但是一些不好的sql会导致我们的索引失效,下面介绍一下索引失效的几种情况
60 0
MySQL查询优化终极版(强烈建议收藏)
select查询优化一直是日常开发和数据库运维绕不开的一道坎,SQL的查询速度决定了页面的加载速度,进一步决定了客户浏览体验。
350 0
MySQL查询优化终极版(强烈建议收藏)
对于敏感列权限的申请
对于敏感列权限的申请
63 1
确保你的查询语句正确地使用了索引
确保你的查询语句正确地使用了索引
65 1
MysSQL索引会失效的几种情况分析
MysSQL索引会失效的几种情况分析
163 0
MysSQL索引会失效的几种情况分析
什么是回表查询
这种查询就必须先在索引文件中找到name为小张的索引节点,很明显这个节点里面只有id,因为这张表只有主键索引,再根据id去数据文件查找具体数据
297 0
mysql使用 from两表查询与join两表查询区别
在mysql中,多表连接查询是很常见的需求,在使用多表查询时,可以from多个表,也可以使用join连接连个表这两种查询有什么区别?哪种查询的效率更高呢? 带着这些疑问,决定动手试试1.先在本地的mysql上先建两个表one和twoone表 CREATE TABLE `one` ( `id`.
5685 0
如何查看表和索引的统计信息
原文:如何查看表和索引的统计信息     这几天要求做一个服务器的统计信息,主要针对表和索引。下面我就简单分享几个查询数据表和索引统计信息的方法: 1.使用T-SQL 语句实现: select schema_name(t.
1225 0