阿里为什么禁止三表join关联
了解过oceanBase和Mycat的同学应该知道,这两个阿里的产品只支持2表关联。
一 为什么不让在mysql用三表关联?
Mysql自身具备设计缺陷,超过3表关联是Mysql Sql优化器做的不好,NLJ多级嵌套性能差。
简述一下问题所在:
如果表A是商品表,表b是订单表,那么订单表必有一个字段是商品id,订单肯定是远远大于商品表的,当订单的数量到很大的量级时,必然设计到对订单的分片,如果之前我们设计的是双表,三表关联,当我们的业务被拆分,甚至说表b,表c被拆成了独立的项目,那么此时我们的业务是分开的,我业务系统b不可能让你直接跨库对我表b进行关联,那么我之前写的关联查询的代码,就全都需要重新写过。
解决方案1:
拆分sql,从表1查出来,表2,表3,用in查询 - 适合小批量,in有查询上线
解决方案2: 反范式表
将需要关联查询的表,字段拼接成大表,存在更新的时候就触发更新策略更新大表
注意:为什么不用视图,视图也是查询,不提高效率,为什么不用物化视图,那和加这个表有什么区别?哈哈哈哈哈
解决方案3: t+1 (其实就是数据延迟处理一天)
采用etl,将我们数据源的数据导入,加工,存储到数据仓库里边
例如使用倒排表:
之前我们需要关联的字段不是该表的分片根据字段,所以当我需要的时候,还是需要去所有的分片扫描,设计倒排表,将该字段作为主键,然后根据这个去分片,就可以根据此id来提取了