来源

zhihu.com/question/56236190

喜马拉雅山脉的钱德拉塔尔湖,印度 (© f9photos)


 前   言 

最近在看《阿里巴巴开发手册》,发现一个很有趣的编程规约,即《阿里巴巴开发手册中》第五章第二节第二条中明确规定了:

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

不信你看:

这让人突然想起了这张神图:

woc,看来以前多表狂 join的骚操作该停一停了。。。


 为什么做这种限制 

打个比方,如果我有无限的钱,我想买个豪华别墅,想买个跑车,想买个直升飞机,但现实是我没钱,只能租房住,只能走路上下班。

如果数据库的性能无限强大,多个表的join肯定是需要的,尤其是复杂的分析型(OLAP)查询,甚至可能涉及10几个表的join,但现实是大部分数据库的性能都太弱了,尤其是涉及到多表join的查询。

规范一看就是在使用 MySQL时的限制(这种规范实际上迫不得已的限制),做这个限制有两个原因:

一是优化器很弱,涉及多个表的查询,往往得不到很好的查询计划,这块比较复杂,需要看一些MySQL深层次的书籍;二是执行器很弱,只有 nested loop joinblock nested loop joinindex nested loop join

  • nested loop join 就是分别从两个表读一行数据进行两两对比,复杂度是 n^2

  • block nested loop join 是分别从两个表读很多行数据,然后进行两两对比,复杂度也是 n^2,只是少了些函数调用等overhead

  • index nested loop join 是从第一个表读一行,然后在第二个表的索引中查找这个数据,索引是B+树索引,复杂度可以近似认为是 nlogn,比上面两个好很多,这就是要保证关联字段有索引的原因
  • 如果有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了,查询的性能就可以提高很多了。

除此之外,常见的还能思考到的解决方法比如有:

  • 可以尝试拆解复杂查询语录成为多条查询语句,将1拆解为n+1,其中每条简单的大表查询尽量走索性,提高查询效率。当然也要参考隔离级别是否会产生数据不一致的情况。
  • join顺序适当优化,尽量优化
  • 自建应用层缓存,但涉及到增删查改可能额外代价比较大。

当然多插一句,不同项目的业务不同,能定制化解决的方案也不尽相同,还是得根据实际情况来。


 多BB两句 

这种问题没有对错,属于中立性问题,无论从正面或反面都能解释出一堆原因。

任何规范都有自己合适的应用场景,很明显 超过三张表禁join是阿里中的场景,而不是你的场景,写代码需要有自己的思维,不能因为阿里说禁join 谷歌说不推荐try catch,然后你就按图索骥全线禁止join禁止try catch。要根据实际情况,该join的join,该catch的catch,其实现代的商业数据库对sql的优化能力比你自己写的可能还是要高不少的。


所以小伙伴们,如果超过三张表不让你join,你会怎么办呢?


后   记

若有错误或者不当之处,可在本公众号内反馈,一起学习交流!

更多热文在此:

●  Spring Boot 系列实战文章合集(源码已开源)

●  程序员写简历时必须注意的技术词汇拼写

●  基于Spring Security OAuth2的SSO单点登录+JWT权限控制实战

●  从一份配置清单详解Nginx服务器配置

●  如何在Windows下像Mac一样优雅的开发

●  Docker容器可视化监控中心搭建

●  利用ELK搭建Docker容器化应用日志中心

●  真实IT领域2/8法则,扎心了!

●  一文详解 Linux系统常用监控工具


更多 务实、能看懂、可复现的 技术文章、资源尽在公众号 CodeSheep,欢迎扫码订阅,第一时间获取更新 ⬇️⬇️⬇️

大表join大表_阿里开发规范:超过三张表,禁止join骚操作相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. bartender外部表不是预期格式_三张表轻松搞定项目计划

    俗话说凡事预则立,我们做项目更要如此,其实生活也雷同,比如说小到买个家电,从预算.到品牌选择或者商场选择.到安装使用等整个过程. 下图展示计划的主要思考点,仅供参考 项目主要包括需求沟通和方案预研.需 ...

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

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

  9. mysql三张表 left join

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

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

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

最新文章

  1. SpringBoot (五) :SpringBoot整合mybatis
  2. 【51NOD1287】加农炮
  3. 使用SearchView报错java.lang.UnsupportedOperationException: Failed to resolve ...
  4. 康柏川(帮别人名字作诗)
  5. C#关于base64图片字符串的压缩方法
  6. java execute 执行成功_【JAVA】设计模式之命令模式(Command模式)的使用分析
  7. 自己创建DXperience的本地资源文件
  8. 基于Verilog实现2ASK调制
  9. 【应急响应】Linux应急响应入侵排查思路
  10. 仿微信图片编辑 全网功能最全的图片编辑器
  11. SQL 基础教程 练习题 Chapter 1
  12. 代码之外——禅心慧语
  13. css3循环360度图片旋转
  14. java中获取中文拼音(全拼)和中文首字母
  15. 料:泡好的大米15克
  16. wf显示远端服务器无反应,无线路由器连接不上网络,一直提示网络服务器远端无响应!...
  17. 做ctf题目的时候运行程序就会显示ImportError: cannot import name ‘flag‘ from ‘secret‘ 求大佬解答
  18. 职场面试中遇到的问题,八个方案,见招拆招
  19. 又一本宝藏级Python教程,清华大学监制出版,附电子版!
  20. Vue快速入门(狂神版)

热门文章

  1. 4、elasticsearch安装head插件
  2. P1809 过河问题_NOI导刊2011提高(01)
  3. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式
  4. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
  5. Linux上oracle精简版客户端快速部署
  6. HTML5线性图表 图表数据区域可着色
  7. CGPathAddArc
  8. Windows 7(server 2008) 下直接硬盘安装 Ubuntu 10.04成为双系统的方法
  9. Openlayers 杂项
  10. linux解压压缩命令