

为什么阿里巴巴禁止数据库中做多表join?
source link: http://www.hollischuang.com/archives/6730
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为什么阿里巴巴禁止数据库中做多表join?
阿里出过一个《Java开发手册》,上面有一条规约是禁止超过三张表的join。
而实际操作过程中,我们平时确实在SQL中写JOIN也比较少,两张表JOIN有的时候也有,多张表的JOIN在离线数据分析的时候很多,但是在线系统确实很少。经常有人问我为什么?
其实最主要的原因就是join的效率比较低。
MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,简单点说就是要通过两层循环,用第一张表做外循环,第二张表做内循环,外循环的每一条记录跟内循环中的记录作比较,符合条件的就输出。
而具体到算法实现上主要有simple nested loop,block nested loop和index nested loop这三种。
而且这三种的效率都没有特别高。
首先,最差的算法就是simple nested loop,他的做法简单粗暴,就是全量扫描连接两张表进行数据的两两对比,所以他的复杂度可以认为是O(n^2)
好一点的算法是index nested loop,当Inner Loop的表用到字段有索引的话,可以用到索引进行查询数据,因为索引是B+树的,复杂度可以近似认为是O(nlogn)
那block nested loop这种算法,其实是引入了一个Buffer,会提前把外循环的一部分结果提前放到多个JOIN BUFFER中,然后内循环的每一行都和多个buffer中的所有数据作比较,从而减少内循环的次数。他的复杂度是O(M*N)
,这里的M是buffer的个数。
所以,虽然MySQL已经尽可能的在优化了,但是这几种算法复杂度都还是挺高的,这也是为什么不建议在数据库中多表JOIN的原因。随着表越多,表中的数据量越多,JOIN的效率会呈指数级下降。
如果不能通过数据库做关联查询,那么需要查询多表的数据的时候要怎么做呢?
主要有两种做法:
1、在内存中自己做关联,即先从数据库中把数据查出来之后,我们在代码中再进行二次查询,然后再进行关联。
2、数据冗余,那就是把一些重要的数据在表中做冗余,这样就可以避免关联查询了。
其实数据冗余是互联网业务中比较常见的做法,其实本质上是软件开发中一个比较典型的方案,那就是”用空间换时间”,通过做一些数据冗余,来提升查询速度。
在互联网业务中,比较典型的就是数据量大,并发高,并且通常查询的频率要远高于写入的频率,所以适当的做一些反范式,通过做一些字段的冗余,可以提升查询性能,降低响应时长,从而提升并发度。
(全文完) 扫描二维码,关注作者微信公众号

Recommend
-
56
屏幕虚化是非常简单的屏幕后处理特效之一,它的基本做法是对图片中的像素进行加权平均,也就是让每个像素的颜色都或多或少的受到周围像素颜色的影响,进而模糊画面,产生撸多了的效果,网上屏幕虚化的教程很多,在此
-
36
我人生中做的第一条小板凳,娃儿们很喜欢,我也很开心。再给孩子们做几个小勺子玩。
-
25
在生活和工作中,往往充斥着一些枯燥且乏味的事情。所以要让自己从机械地重复性劳动中解放出来,才是解放身心的正确姿势。 本文列举了我自己平时在工作和生活中的七个小场景,每个场景都是带有这样「重复性」性质的事情,一起看...
-
14
谈谈这两年在业务中做技术的思考 发表于2020-08-17 一个闷热的中午,照常与几位同事在连廊吃午饭。跟我当初一起入职的同事提起...
-
9
如何在开源技术社区中做设计?本文来自 Serverless 团队中首席设计师 Andre Pires 的分享 —— Serverless 设计理念:从头创建品牌标识,展现了...
-
7
本篇是基于柏链教育公司、上贸大研究中心团队、柏链教育系里面成员、以及我在FISCO BCOS上进行的联盟链方向探索的经验分享总结,希望给大家带来启发及借鉴作用。 这次分享的主题分为4个部分:第一是谈谈分布式体系架构特点及差异,第二是谈谈如何进行链...
-
9
V2EX › MySQL 请教 MySql 多表 join 怎么优化好 MozzieW · 1 天前 · 1773 次点击
-
8
你人生中做过最大胆的决策是什么?为什么? - PMCAFF产品经理社区 匿名用户 • 第一个是:研究生二级...
-
7
-
7
如何在 Figma 中做交互设计? 更新时间:2023-02-21 20:49:18 Figma 是一款功能强大的设计工具,拥有许多用于设计和原型制作的工具。那么,如何在 Figma 中做...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK