大表join大表_阿里开发规范:超过三张表,禁止join骚操作
来源
zhihu.com/question/56236190
喜马拉雅山脉的钱德拉塔尔湖,印度 (© f9photos)
最近在看《阿里巴巴开发手册》,发现一个很有趣的编程规约,即《阿里巴巴开发手册中》第五章第二节第二条中明确规定了:
超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。
不信你看:
这让人突然想起了这张神图:
woc,看来以前多表狂 join的骚操作该停一停了。。。
打个比方,如果我有无限的钱,我想买个豪华别墅,想买个跑车,想买个直升飞机,但现实是我没钱,只能租房住,只能走路上下班。
如果数据库的性能无限强大,多个表的join肯定是需要的,尤其是复杂的分析型(OLAP)查询,甚至可能涉及10几个表的join,但现实是大部分数据库的性能都太弱了,尤其是涉及到多表join的查询。
规范一看就是在使用 MySQL时的限制(这种规范实际上迫不得已的限制),做这个限制有两个原因:
一是优化器很弱,涉及多个表的查询,往往得不到很好的查询计划,这块比较复杂,需要看一些MySQL深层次的书籍;二是执行器很弱,只有 nested loop join
, block nested loop join
和 index 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,实现起来比较复杂
但是,可是我确实需要两个表里的数据链接在一起怎么办呢。
一种方案是:我们可以做个冗余,建表的时候,就把这些列放在一个表里,比如一开始有 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顺序适当优化,尽量优化
自建应用层缓存,但涉及到增删查改可能额外代价比较大。
当然多插一句,不同项目的业务不同,能定制化解决的方案也不尽相同,还是得根据实际情况来。
这种问题没有对错,属于中立性问题,无论从正面或反面都能解释出一堆原因。
任何规范都有自己合适的应用场景,很明显 超过三张表禁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骚操作相关推荐
- 阿里规定超过三张表禁止JOIN,为啥呢?
作者 | e71hao 来源 | http://blog.itpub.net/30393770/viewspace-2650450/ 一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过 ...
- 涨知识了!阿里规定超过三张表禁止join,为啥?
点击上方"菜鸟学Python",选择"星标"公众号 重磅干货,第一时间送达 作者:e71hao blog.itpub.net/30393770/viewspac ...
- 为什么阿里巴巴规定禁止超过三张表 join?
欢迎关注方志朋的博客,回复"666"获面试宝典 概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌 ...
- 为什么禁止超过三张表 join,原理是什么?
概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort ...
- 为什么阿里巴巴规定禁止超过三张表 join
点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql ...
- oracle中join另一个表后会查询不出一些数据_阿里规定超过3张表,禁止JOIN,为何?
一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析 对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...
- bartender外部表不是预期格式_三张表轻松搞定项目计划
俗话说凡事预则立,我们做项目更要如此,其实生活也雷同,比如说小到买个家电,从预算.到品牌选择或者商场选择.到安装使用等整个过程. 下图展示计划的主要思考点,仅供参考 项目主要包括需求沟通和方案预研.需 ...
- mysql jion 三张_mysql三张表 left join
1.建表和数据 学生表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCR ...
- mysql三张表 left join
1.建表和数据 学生表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCRE ...
- sql 语句left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on下去?
今天这个帖子要解决一个问题:oracle数据库表间通过left join关联超过2张表时,随着left join一路向左,永远只能是最左边的关联表与新表关联吗?还是母表可以一直on 下去? 利用sql ...
最新文章
- SpringBoot (五) :SpringBoot整合mybatis
- 【51NOD1287】加农炮
- 使用SearchView报错java.lang.UnsupportedOperationException: Failed to resolve ...
- 康柏川(帮别人名字作诗)
- C#关于base64图片字符串的压缩方法
- java execute 执行成功_【JAVA】设计模式之命令模式(Command模式)的使用分析
- 自己创建DXperience的本地资源文件
- 基于Verilog实现2ASK调制
- 【应急响应】Linux应急响应入侵排查思路
- 仿微信图片编辑 全网功能最全的图片编辑器
- SQL 基础教程 练习题 Chapter 1
- 代码之外——禅心慧语
- css3循环360度图片旋转
- java中获取中文拼音(全拼)和中文首字母
- 料:泡好的大米15克
- wf显示远端服务器无反应,无线路由器连接不上网络,一直提示网络服务器远端无响应!...
- 做ctf题目的时候运行程序就会显示ImportError: cannot import name ‘flag‘ from ‘secret‘ 求大佬解答
- 职场面试中遇到的问题,八个方案,见招拆招
- 又一本宝藏级Python教程,清华大学监制出版,附电子版!
- Vue快速入门(狂神版)
热门文章
- 4、elasticsearch安装head插件
- P1809 过河问题_NOI导刊2011提高(01)
- 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式
- WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
- Linux上oracle精简版客户端快速部署
- HTML5线性图表 图表数据区域可着色
- CGPathAddArc
- Windows 7(server 2008) 下直接硬盘安装 Ubuntu 10.04成为双系统的方法
- Openlayers 杂项
- linux解压压缩命令