字节跳动高工面试:从阿里手册引出的Join查询思考深度好文

本文探讨了在实际工作中是否应该使用Join查询的问题,引用了《阿里Java编程规范手册》中的相关规范,强调超过三个表的JOIN会严重影响性能。文章通过实例解释了如何通过反范式设计解决多表关联,并提醒了数据类型一致性和关联字段索引的重要性,以提高查询效率。
摘要由CSDN通过智能技术生成

Join查询再熟悉不过了,看视没有必要把它拿出来说事,但某天一个学生问起了一个问题,有必要拿来说下。

很多同学的毕生梦想都是想进BATJ的某家公司,其中又以案例为多数,是的,不管从哪个角度来说,阿里都是一个非常棒的公司,值得去挑战一把。

回到今天的话题,一个同学(阿里的铁杆粉),问了我一个问题,在实际工作中到底应不应该用join查询,到底应该注意点什么?

别以为这个问题很傻,如果你关注过阿里的规范,里面就有显著的一条:

【强制】超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。

首先,我要交代,上面这句话出自《阿里java编程规范手册》,并不是我的原创,另外我想说的是,对于上面这句话,我不管你懂不懂为什么,请按手册里面说的,强制去执行。

不过既然有同学再问,我认为还是有必要把这个问题拿来分析下。

禁止超过3表的JOIN

如果太多的表JOIN对性能的影响是非常大的(Join的性能以及注意事项我后面再分析),这个我相信,对于绝大多数读者来说都是认可的,起码能做到表面上理解,但也不排除某些另外情况,比如说…

某天,有个同学小甲,给我发个SQL语句,一方面夸夸其谈它对公司的业务,表结构了解的如何透彻。

我打开sql文件后,一个2132行的sqL语句映入眼帘,我心里顿时(&%%¥&……),好吧,我得承认这情况并不只一个,而且他们以这个为荣,我不知道当这同学离职后,后面接手的会不会和我一样的心情。

现在我也无力反驳他,这可能在某些特殊的情况下对他是好的(谁敢开除他,谁敢接他的手),我现在只想聊聊出现过多表关联之后怎么来解决。

确实答案也出自《阿里java编程规范手册》

【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。

其实虽然规范里面没说,但这是数据库设计里面非常重要的一条:

反范式设计

· 反范式化是针对范式化而言的,在前面介绍了数据库设计的范式

· 所谓得反范式化就是为了性能和读取效率得考虑而适当得对数据库设计范式得要求进行违反

· 允许存在少量的冗余,换句话来说反范式化就是使用空间来换取时间

举一个简单的例子:

上面这个sql语句查询的数据来自a,b两张表,仔细看你会发现,其中只有cl4这一列是出自b表,其他的所有都是a表,这样可以考虑建立一个c表,把c1l,cl2,cl3,cl4的数据全部关联起来,实际做的事情就是冗余了cl4这个字段。

带来的好处呢? 查询的时候只要查询c表,效率不会提升才怪。

数据类型必须一致

数据类型必须一致,请完全遵守,如果你定是要寻根究底转牛角尖,那我们做个实验,做实验的前提是你要了解些许的执行计划,当然对索引也得一知半解才行。

数据和表都准备好了后,我来写一个sql语句:

很棒,结果也查询出来了,name是varchar类型, 而给出的2000是整型,这有什么问题吗?结果不是正确的嘛?

别着急,还记得前面创建了索引嘛?

使用执行计划看下:

看出问题了吗?虽然我指定的name上面是索引的,但数据类型不一致,不好意思,结果是全表扫描。

如果数据类型一致呢?

key有值,代表就是用到了索引,so,不需要再钻牛角尖了吧!

保证被关联的字段需要有索引

这句话很好理解吧,如果t1,t2表,如sql语句:

你可能会问straight_join是什么? 他和join有什么区别呢?

好吧,你既然问到了,我就还是说下,如果你使用join,Mysql优化器可能会选择t1或者t2来作为驱动表,而我使用的是straight_join,那么关系很明确了,t1是驱动表,那t2就是被驱动表。

既然语句知道被驱动表了,那被关联的字段就是t2.a,按照规范的要求,必须在t2表的a列上必须创建有索引。

t1是驱动表,我从t1表里面取出数据后,再去t2表查询:

· 如果t2.a有索引,我根据索引查询就好,查询了结果合并t1表的记录返回。

· 如果t2.a没索引,那么就尴尬了,需对t1表里面的所有数据都需要在t2表进行一次全表扫描,如果t1是1000行数据,t2是10000,那得扫描多少行呢?结果是(t1行数*t2行数)1000万。

这个时候我相信你也已经理解为什么被关联的字段需要有索引了吧。

deer

更多Java架构进阶视频资料和架构面试专题,关注【享学课堂online】微信公众号免费领取!

小提示:点开石墨文档链接:https://shimo.im/docs/vrfAWTGmcF0H6z2H,扫码二维码关注微信公众号领取免费架构视频资料和面试专题资料更多关于Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以免费送给我的读者朋友们:

目录:

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

a面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-pGviF9gz-1623501582344)]

Java面试核心知识点

资料的领取方式:点赞后【戳面试资料】即可免费获取哦!

对于阿里开发手册中的"join"这个词,我可以给出以下解释。根据引用中提到的数据库性能问题,多表的join操作可能会影响查询性能,特别是在复杂的分析型查询中。因此,阿里开发手册可能会提出一些规范和建议来优化join操作的使用。 具体来说,阿里开发手册可能会建议开发人员谨慎使用多表join,尤其是在涉及多个表的复杂查询中。可能会推荐优化查询语句的设计,避免不必要的join操作,或者使用其他技术和工具来解决查询需求,例如数据冗余、索引优化、缓存等。 此外,根据引用中提到的《阿里java编程规范手册》,阿里开发手册可能会强调遵循手册中的规定和要求,包括对于join操作的使用。因此,如果开发人员想要遵守阿里的开发规范,他们可能需要查阅手册中有关join操作的章节,并按照手册的指导进行开发。 总结起来,阿里开发手册可能会提供关于join操作的规范和建议,以优化查询性能和保证代码质量。开发人员应该遵循手册中的规定,合理使用join操作,并考虑其他优化方案来满足查询需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [字节跳动高工面试:从阿里手册引出Join查询思考深度好文](https://blog.csdn.net/m0_57064331/article/details/117855368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [《阿里巴巴JAVA开发手册》超过三张表禁止join](https://blog.csdn.net/MinggeQingchun/article/details/119720505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值