文档章节

微课程 | 第八课《Global 表简介》

爱可生
 爱可生
发布于 2019/12/13 17:50
字数 1380
阅读 11
收藏 0

https://v.youku.com/v_show/id_XNDQ2ODE3NTAxMg==.html

上一期我们主要介绍了一些不同拆分规则的表怎样使用,接下来我们介绍一下 Global 表。

什么是 Global 表?

我们有一个定义:对于数据量不大的字典表(比如超市商品)。对于零售系统来说,比如超市商品 SKU 可能有几十万规模的数据量,并且 SKU 不会出现大量增删改,也不会出现并发增删改。对于这样的数据特性来说,非常适合做 Global 全局表。

全局表就是在多个分片上都有一份同样的副本。

我们在这里举了一个这样的例子。sales 表是详细销售情况表,按照时间日期来拆分的。我们可以按照左边的 date 是 20190211,右边的 date 是 20190212,按照 date 字段拆分的,而商品表可以完全一模一样复制一份到每个库。因为商品表不经常做增删改,也没有很大的并发压力,是非常适合做全局表。

这样一个设计有什么好处呢,就是当我在做 JOIN 的时候,我可以只按照 sales 表的分布区路由数据,而不用关心商品表的分布。这样直接路由下发是正确的,我们来看在 DBLE 当中 Global 表是怎么配置的。

Global 表配置操作

https://v.youku.com/v_show/id_XNDQ2ODE3OTA3Ng==.html

我们去看 schema.xml 文件当中,我们之前预定义了两个 Global 表。可以看到这里有 tb_global1 和 tb_global2 两个配置。有两个属性,一个 type,一个 datanote。

tb_global2 表的 datanode 是 dn1-4,指向四个节点。这样的话它的副本数量就是四份,需要在四个节点中维护一个一模一样的表数据。

这样如果别的拆分表涉及到的分片也是这四个,或者是它的范围子集的话。跨库 INNER JOIN 时就可以通过 SQL 的整体下发在中间件,简单合并来得到正确的结果。

Global 的 JOIN 操作

现在还是 tb_mod,还是按照 4 求模拆分的这张表。另外一张 Global 表只有两条数据,放在了此表配置的各个节点。这时候我去做 JOIN ,结果会怎么样呢,我们来看案例。

https://v.youku.com/v_show/id_XNDQ2ODE4MDM4MA==.html

首先我们要展示一下 Global 表的能力,也就是 Global 表怎么样在四个节点上工作。我们现在看一下 Global 表,应该是预先写好了两条数据。现在我新增一条数据上去,看怎么样在这四张表当中去维护。这是一条 insert 数据,id 我们指定为1024,可以查到。然后我们去真正的数据库节点上,端口 33061 和 33062。我们刚才已经看到 dn1 到 dn4。对于 33061 这个实例来说就是 db_1 和 db_3。我们去看接下来数据状态,我们可以看到 tb_global_2 里面已经有这条数据了。我们换一下从 db_3 当中去查一次也是三条数据。我们换一下,从 33062 端口里面去演示一下其实 DBLE 内部是通过两阶段提交的分布式事务来做到。四个节点数据保持一致的 Global 表基本构成就是这样的。所以我们现在回到 8066 端口来做一下 tb_mod 表和 Global 表的 JOIN。

我们先讲一下 INNER JOIN,INNER JOIN 是比较简单的一种情况。我们直接和本地的数据库 JOIN 就可以。结果是正确的,因为现在只有两条数据。然后我们通过 EXPLAIN 看一下,是不是跟普通 JOIN 步骤一样。我把所有数据收集到中间件节点再做 JOIN,结果应该有六行。其实前四个 SQL 内容都是一样的,只不过被路由到了不同的节点。整个 JOIN 被直接下发下去,然后在中间件简单合并一下就结束了。

我们再看 LEFT JOIN,拆分表 LEFT JOIN Global 表是可以的。RIGHT JOIN其实是 LEFT JOIN 反过来,相当于 Global 表作为左表的 LEFT JOIN 拆分表。这时候我们可以发现查询结果已经不一样了。已经回到我们讲过的的跨库 JOIN,这样一个执行的方式,是把所有表的数据都收集起来。然后在中间件去做 JOIN,而不是语句直接下发。

大家可以想象一下为啥 RIGHT JOIN 不行?

其实这涉及到了 MySQL 语义,如果我整体的去把 JOIN 下发的话,因为我的 RIGHT JOIN 需要筛选出 Global 表有的拆分表没有的。如果我直接下发的话 RIGHT JOIN,每个分片都会丢一部分这类型的数据。

虽然 Global 表和拆分表的 INNER JOIN 可以优化,但是 LEFT JOIN 还是会回到跨库查询,所以大家业务需要严格审核 SQL,避免带来性能问题。

好,我们今天先介绍到这里。

图文稿为了方便阅读,在不影响学习的情况下优化了一些口语化词汇,文稿与视频会尽量保持一致。

© 著作权归作者所有

爱可生

爱可生

粉丝 14
博文 213
码字总数 381361
作品 1
徐汇
私信 提问
百度Apollo无人驾驶入门课程下载

本文提供 百度Apollo官网的无人驾驶入门课程下载,主要为视频文件。 视频数量:101个;文件格式:MP4;视频总时长:2小时40分钟;文件总大小:约1.13GB; 马上下载 关注公众号罗孚传说(Rove...

罗孚传说
2018/07/28
0
0
第一期APP复盘

1、布偶(APP)未实现的功能 三年愿景部分 (选择颜色) 课程购买 (支付) 消息推送 个人信息数据显示 2、布偶(APP)视觉有问题的页面 课程分类->课程列表 我的微课->播放单个声音的时候 ...

kissjs
2017/02/08
2
0
免费公开课 | 一步步 TensorFlow 项目实战

本课程主要是按照 TensorFlow Machine Learning 这本书进行教学,网上也有开源的代码,需要可以帮助大家更好的学习。如果你想加入交流群,也可以添加小助手微信号:862251340,加入交流群,一...

chen_h
2017/12/11
0
0
七月在线 PyTorch的入门与实战

课程大纲 第一阶段 从PyTorch起步掌握DL基础 第一课 深度学习回顾与PyTorch简介 知识点1: 知识点:神经网络模型回顾(线性层,非线性激活函数,SoftMax),用PyTorch定义神经网络模型 知识点...

吾爱记忆
2019/11/01
0
0
MPLS VPN 快速入门(张洋讲解版)

MPLS VPN 快速入门(张洋讲解版) 课程目标: 本课程所描述MPLS VPN从零开始学习的内容,为后面MPLS VPN设计和规划的高级教程打下坚实的基础,本课核心目标是:一、从真正意义上去理解MPLS的工...

kingsir827
2016/04/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kettle自定义jar包供javascript使用

我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法。所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用。 本篇文章有参考自:https://www...

CREATE_17
昨天
102
0
处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
昨天
79
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
昨天
73
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
昨天
124
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
昨天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部