点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

来源 | https://dwz.cn/LuowUpuc
最近,在知乎上看到一个有意思的问题,我个人觉得不错,挺有收获,在这里跟大家分享一下。
题目:《阿里巴巴JAVA开发手册》里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写?



一般,我对于这种问题,解决方案是查询官方文档,要么查看我的工具书《高性能的MySQL》,在本书的6.3节:重构查询的方式里面提到,需要考虑实际情况,看看是否有必要将一个复杂的查询分解成多个简单的查询,并不一定要把所有的工作全都移交给数据库(转换思路)!!!

其实Join拆解的核心就是利用In关键字,这个也是出自该书,你不信,那我还是只能给你拍照(见下图)。

所有的问题答案都在书中,这也是我经常推荐大家,要多读书,读好书,比如,我经常给你们推荐的书(我又在装叉了,哈哈)。
计算机解决问题,要么用空间换时间,要么用时间换空间,此二法基本上能解决大多数疑难杂症,你现在看到的各种高大上的玩法,基本上都跟此二法沾亲带故。
比如,该问题下,阿里大佬李晨曦的回答,通过空间换时间的方案来设计表,虽然数据冗余了,但查询性能显著提升了,挺有意思。

------

该大佬的回答如下:
一:为什么做这种限制?
打个比方,如果我有无限的钱,我想买个豪华别墅,想买个跑车,想买个直升飞机,但现实是我没钱,只能租房住,只能走路上下班。
如果数据库的性能无限强大,多个表的join肯定是需要的,尤其是复杂的分析型(OLAP)查询,甚至可能涉及10几个表的join,但现实是大部分数据库的性能都太弱了,尤其是涉及到多表join的查询。给@韩飞点个赞,国内懂这个做这个的太少了,以后就靠他们了。
规范一看就是在使用MySQL时的限制(这种规范实际上迫不得已的限制),做这个限制有两个原因:一是优化器很弱,涉及多个表的查询,往往得不到很好的查询计划,这块比较复杂,感兴趣的朋友可以关注我,我以后会写文章专门介绍;二是执行器很弱,只有nested loop join,block nested loop join和index nested loop join。
1、nested loop join就是分别从两个表读一行数据进行两两对比,复杂度是n^2。
2、block nested loop join是分别从两个表读很多行数据,然后进行两两对比,复杂度也是n^2,只是少了些函数调用等overhead。
3、index nested loop join是从第一个表读一行,然后在第二个表的索引中查找这个数据,索引是B+树索引,复杂度可以近似认为是nlogn,比上面两个好很多,这就是要保证关联字段有索引的原因。
4、 如果有hash join,就不用做这种限制了,用第一个表(小表)建hash table,第二个表在hash table中查找匹配的项,复杂度是n。缺点是hash table占的内存可能会比较大,不过也有基于磁盘的hash join,实现起来比较复杂。
二:在这种限制下SQL怎么写?
可是我确实需要两个表里的数据链接在一起啊,我们可以做个冗余,建表的时候,就把这些列放在一个表里,比如一开始有student(id, name),class(id, description),student_class(student_id, class_id)三张表,这样是符合数据库范式的(第一范式,第二范式,第三范式,BC范式等),没有任何冗余,但是马上就不符合“编程规范“了,那我们可以用一张大表代替它,student_class_full(student_id, class_id, name, description),这样name和description可能要被存储多份,但是由于不需要join了,查询的性能就可以提高很多了。
任何的规范都是在特定情况下的某种妥协,脱离了这个环境,就不一定成立了。
----------
其实,很多同学问我,我是如何解决编程的问题?其实我就是按照以前做数学应用题的方法来解决编程问题,大问题拆分成小问题,小问题在书中就会有相应的例题,照猫画虎,所有小问题都击破了,那么,大问题就迎刃而解了,这便是所谓的不攻自破。
其实,你遇到的问题,90%都能通过搜索引擎解决,而你非得要做伸手党,哎...

最后,还是推荐一下《高性能MySQL》这本给各位同学(这是我第3次推荐了~~~),没事多读读,网上也有电子版,但我建议大家还是去买一本实体书,当做工具书用。


多读书,读好书。

本文通过OpenWrite的Markdown转换工具发布

关注我,回复“加群”加入各种主题讨论群

  • RESTful 架构基础

  • 17 个方面,综合对比四大消息中间件

  • 9 个爱不释手的 JSON 工具

  • 手把手教你定制标准 Spring Boot starter

  • 程序员接私活的10个平台和一些建议

朕已阅 

阿里规定超过三张表禁止JOIN,为啥?相关推荐

  1. 阿里规定超过三张表禁止JOIN,为啥呢?

    作者 | e71hao 来源 | http://blog.itpub.net/30393770/viewspace-2650450/ 一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过 ...

  2. 涨知识了!阿里规定超过三张表禁止join,为啥?

    点击上方"菜鸟学Python",选择"星标"公众号 重磅干货,第一时间送达 作者:e71hao blog.itpub.net/30393770/viewspac ...

  3. oracle中join另一个表后会查询不出一些数据_阿里规定超过3张表,禁止JOIN,为何?

    一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析 对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...

  4. 为什么阿里巴巴规定禁止超过三张表 join?

    欢迎关注方志朋的博客,回复"666"获面试宝典 概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌 ...

  5. 为什么禁止超过三张表 join,原理是什么?

    概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort ...

  6. 为什么阿里巴巴规定禁止超过三张表 join

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql ...

  7. mysql jion 三张_mysql三张表 left join

    1.建表和数据 学生表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCR ...

  8. mysql三张表 left join

    1.建表和数据 学生表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCRE ...

  9. sql 语句left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on下去?

    今天这个帖子要解决一个问题:oracle数据库表间通过left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on 下去? 利用sql ...

  10. 产品经理最最最最需要关切的三张表

    作者:刘雨 全文共 4141 字,阅读需要 9 分钟 ---- / BEGIN / ---- 我们知道在财务系统里有三张表:「 资产负债表 」.「 利润表 」和 「 现金流量表 」. 资产负债表反映公 ...

最新文章

  1. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(配置数据点抖动显示jitter)实战
  2. R语言构建logistic回归模型:WVPlots包PRTPlot函数可视化获取logistic回归模型的最优阈值、优化(precision、enrichment)和recall之间的折衷
  3. cdmp不停增长 oracle_系统内存不足导致oracle进程被误杀terminating the instance due to error 822...
  4. 让关键词排名更稳定提升的优化技巧有哪些?
  5. getopt( )和 getopt_long( )
  6. consul 命令行参数
  7. 程序员中年危机的破解之道
  8. Codeforces Round #772 (Div. 2) D. Infinite Set (动态规划+思维)
  9. 界址点圆圈怎么生成_手机联系人怎么加入黑名单
  10. 钉钉、微信产品大PK,基因已经决定了结果
  11. c++ 读文件_C语言文件操作大全
  12. 一个简单mvp安卓应用的设计
  13. 淘淘商城第105讲——购物车实现分析及工程搭建
  14. 大学计算机信息技术课程评价,信息技术课程学习心得体会精选范文
  15. 使用svg实现的曲线时间线 2022-01-09
  16. 电视剧旗舰剧情分集大结局
  17. 宏碁暗影骑士设置u盘启动教程
  18. 两次获得微信生态支持的如祺出行,如何破局网约车市场?
  19. 中国5级省市编码 在线查询服务
  20. 数电实验(一)利用与非门设计四舍五入判别电路

热门文章

  1. Ionic页面传参跳转
  2. DeepFM 参数理解(二)
  3. CSDN如何上传照片
  4. 微软打击盗版的“三部曲”
  5. vue element-ui el-upload去除按delete 键可删除提示
  6. 【业务安全-01】业务安全概述及测试流程
  7. python判断是否闰年_【python】判断年份是否为闰年
  8. 服务器信号满格网速很慢,信号满格网速太慢是什么原因
  9. 如何从用户旅程图中挖掘差异化需求?
  10. java开发一款推箱子游戏