• 为什么阿里巴巴禁止数据库中做多表join?


    △Hollis, 一个对Coding有着独特追求的人△

    93cbb2993c4a462da0be79eacff6f0de.jpeg

    这是Hollis的第 397 篇原创分享

    作者 l Hollis

    来源 l Hollis(ID:hollischuang)

    0ed2426e47160cc2590318f88d5e71a3.png

    阿里出过一个《Java开发手册》,上面有一条规约是禁止超过三张表的join。

    1de24db3e1446053a0fa8a9273449264.png

    而实际操作过程中,我们平时确实在SQL中写JOIN也比较少,两张表JOIN有的时候也有,多张表的JOIN在离线数据分析的时候很多,但是在线系统确实很少。经常有人问我为什么?

    其实最主要的原因就是join的效率比较低

    MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,简单点说就是要通过两层循环,用第一张表做外循环,第二张表做内循环,外循环的每一条记录跟内循环中的记录作比较,符合条件的就输出。

    c9c860f48ba57509bc173c710d3eb584.png

    而具体到算法实现上主要有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、数据冗余,那就是把一些重要的数据在表中做冗余,这样就可以避免关联查询了。

    其实数据冗余是互联网业务中比较常见的做法,其实本质上是软件开发中一个比较典型的方案,那就是"用空间换时间",通过做一些数据冗余,来提升查询速度。

    在互联网业务中,比较典型的就是数据量大,并发高,并且通常查询的频率要远高于写入的频率,所以适当的做一些反范式,通过做一些字段的冗余,可以提升查询性能,降低响应时长,从而提升并发度。

    如果你喜欢本文,

    请长按二维码,关注 Hollis.

    dcc09495d38a75d9def56958293f9e36.jpeg

    转发至朋友圈,是对我最大的支持。

    点个 在看 

    喜欢是一种感觉

    在看是一种支持

    ↘↘↘

  • 相关阅读:
    Web大学生网页作业成品——美食餐饮网站设计与实现(HTML+CSS+JavaScript)
    CSS Modules
    Linux下Doris1.1+Mysql安装启动
    系统移植2:bootloader的选择(u-boot)和移植
    【MySQL】MySQL的IFNULL()、ISNULL()、NULLIF()函数用法说明
    毕业论文GPT说:
    网络安全——黑客自学(笔记)
    【趣味随笔】移动机器人基础(导航方式、自主导航、硬件系统结构分布)
    “第五十三天”
    React Hooks —— ref hooks
  • 原文地址:https://blog.csdn.net/hollis_chuang/article/details/126716231