为何阿里官方不同意关联三张及以上数据库表

在阿里巴巴开发手册里有这样一条规定,禁止关联三张及以上的数据库表。这个是为何呢?笔者在之前工作中有了亲身的体验,现在对其进行总结。
正如广大开发人员所知道的,多表关联查询是对一张表的某个字段来匹配另一张表的对应字段,进而从另外一张表里查询对应的属性。这里大家一般采用join查询,此类查询这里分为left join、right join、inner join、cross join这几种。其中,left join是把前面的表作为主表进行全表扫描的,而right join是把右表进行主表全表扫描的。另外两种则是把数目多的表作为主表进行全表扫描的。如果子表对应字段不加入索引,则子表也是根据对应的字段进行全表循环扫描(Block Nested-loop Join)。相反,加入索引之后,子表则是根据索引进行扫描的,效率明显提高。
在关联三张以上的表时,对第二个子表也是再次全表进行扫描,效率明显下降了,耗时超过1秒。而理想的查询耗时是在1秒之内,同时前端的响应耗时默认在30秒,最多在两分钟,超过时间则报服务器无响应的错误。这很好地解释了阿里为何不同意三张及以上的表关联。
除此之外,阿里巴巴官方文档不同意使用外键和级联。这是因为外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。对于外键方面,阿里方面建议采用业务逻辑层来处理对应的,使用适当的冗余,同时要字段类型名称相等。
在常见的orm框架中,mybatis是半自动化的,可以灵活地解析和优化sql语句;而hibernate是全自动化的,解析qbc和hql对应的sql明显包含了三张及以上的表还有外键,查询的效率十分低下,其自动建表的功能除了引入外键之外还不支持普通索引和联合索引。所以,阿里官方建议采用人工建表的方式创建数据库表,并通过逆向工程生成出对应的实体类和dao层。笔者在之前的工作吃尽了hibernate的槽点,最终改换orm框架为mybatis。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值