专栏首页爱可生开源社区分布式 | Global 表 Left Join 拆分表实现原因探究

分布式 | Global 表 Left Join 拆分表实现原因探究

作者:郭奥门

爱可生 DBLE 研发成员,负责分布式数据库中间件的新功能开发,回答社区/客户/内部提出的一般性问题。

本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


本文关键字:JOIN、原理解析、分库分表

相关文章推荐:

分布式 | DBLE 之通过 explain 进行 SQL 优化

分布式 | dble 中分布式时间戳方式的全局序列

问题

前几天,社区交流群一个小伙伴提出这样一个问题:

小伙伴说:全局表和分片表的左连接能否支持 -- 目前测试 Mycat 结果不对。

很显然是想要脱坑的 Mycat 用户,急需找个替代品,主要的是他也找到了,哈哈哈。

场景重现

首先我们创建一个全局表和一个拆分表,各自设置两个分片节点,全局表在两个节点数据一致,拆分表 id=1、2 的在一个节点,id=5000001 的在另一个节点,其中 id=1 和 id=2 的只有 id 字段值不同、code&content 字段值都一样。如图:

Mycat 实现效果

通过 a.id、b.code 将两张表左连接查询,结果如小伙伴所言:Mycat 结果不对。

DBLE 实现效果

同样,通过 a.id、b.code 将两张表左连接查询,结果如下所示;显而易见 DBLE 实际得到的结果符合预期!

结果探究

根据以上使用 Mycat 和 DBLE 进行 “Global 表 Left Join 拆分表查询”得到不同的结果。我们尝试着使用 EXPLAIN 查看同一种类型的查询在执行计划上会有什么不同。

Mycat 执行计划

根据上图执行计划,我们简单分析一下。

Mycat 会将 SQL 原封不动的交由分片配置的所有实例去执行,然后根据执行结果进行合并,这里合并只是简单的对结果进行累加,很显然这样的计划显示 Mycat 内部处理逻辑是错误的!

因为全局表在每个配置的节点都会存储相同的数据,如果将每个节点和拆分表 Left Join 的结果进行简单的 UNION ALL 合并,会造成数据的重复,不能保证数据的准确性。

有些小伙伴可能猜想 UNION 不是会保证数据不重复吗?如果用 UNION 是否可行?同样分析一下。

上述结果仍然得不到我们想要的结果,因为 UNION 只是解决数据重复的问题,不适用于因为分片而导致的数据重复问题;

试想一下,如果 DBLE 未来通过某种算法可以对各个节点的结果集做一个准确的合并,那么这样的问题也就迎刃而解,也会性能方面有个整体的提升。

实际上我们想象中的 X 算法还没有一个良好的实现和证明,但现在又要解决查询正确性的问题,那么 DBLE 是怎么做的呢?下面我们来看下 DBLE 的执行计划:

从上面执行计划来看,简单分析下流程:

DBLE 内部对于这种查询作出了一些区分:全局表只会下发一个实例,拆分表都会下发,然后针对结果做合并。这种处理逻辑肯定是没有错误的,只不过执行计划看起来相对复杂一些,这也代表在 DBLE 内部实现层面上下了不少功夫,但是这也是为了保证数据准确性而作出的一些牺牲吧。

本文分享自微信公众号 - 爱可生开源社区(ActiontechOSS),作者:郭奥门

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 技术分享 | MySQL 子查询优化

    爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。

    爱可生开源社区
  • 技术分享 | InnoDB Cluster 如何高效加载数据

    爱可生南区负责人兼技术服务总监,MySQL ACE,擅长数据库架构规划、故障诊断、性能优化分析,实践经验丰富,帮助各行业客户解决 MySQL 技术问题,为金融...

    爱可生开源社区
  • 故障分析 | MySQL TEXT 字段的限制

    项目中有一个数据交换的场景,由于使用了很多个 varchar(1000)、 varchar(2000),导致在创建表的时候,MySQL 提示:

    爱可生开源社区
  • 2017第二届中国信息安全服务年会:多方解读国家政策,推进网络安全法与关键信息基础设施保护落地

    同一个议题,不同的嘉宾,同与不同的见解或想法。 在参会中我们听到了不同的嘉宾从不同角度解读网络安全法与关键信息基础设施保护,国家政策和国家意志的实现究竟会落实到...

    FB客服
  • 你无法想象,物联网对制造自动化的影响有多大

    物联网不仅是将工业网络扩展到设备级架构,还包括将安全、运动、机器对机器智能、自动维护资源和企业连接性融入到目前难以企及的制造智能。从资源管理到智能机器设备再到预...

    机器人网
  • OCP-052考试题库汇总(24)-CUUG内部解答版

    Which structure can span multiple data files?

    用户5892232
  • 向量空间相关概念总结-点积

    坑吭吭
  • 在云环境上使用SLF4J对Java程序进行日志记录

    我开发了一个Java应用,部署到云环境上之后,用postman测试发现不能按照我期望的工作,但是返回的消息对我没有任何帮助。

    Jerry Wang
  • Top one Best Streaming Sites to Watch Live Cricket Streaming and Scores

    UC Cricketis an Indian cricket news website which features news, articles, live ...

    java开发者
  • 笔记84 | 修复音乐视频拔插U盘不记忆播放时间问题

    音乐跟视频在播放U盘里的文件时,拔插U盘并不会记忆播放时间,此处代码以音乐为例,视频处理类似,有发现有问题请及时指正。

    项勇

扫码关注云+社区

领取腾讯云代金券