接上一篇:企业实战_16_MyCat全局自增ID
https://blog.csdn.net/weixin_40816738/article/details/100064315

案例比较:
在垂直拆分场景中,针对字段个数少的类型为字典类型的表,我们可以使用全局表的方式解决。
在水平扩展场景中,针对数据量很大的表,怎样实现跨分片查询呢? ER分片

文章目录

  • 一、跨分片查询的另一个场景
    • 1. 思考
    • 2. 回顾!
    • 3. 目前,归纳
      • 二、配置order_detail表的全局自增id

一、跨分片查询的另一个场景

1. 思考

order_master表进行了切片操作,而order_detail没有进行切片操作, 2张表,不在一个分片中,现在这种关联属于跨分片关联,针对这种跨分片的查询应该如何处理呢?

2. 回顾!

  • 在垂直拆分场景中,针对这种跨分片查询的情况,有3种方式解决跨分片查询。
方式 应用场景/说明
api 结果拼接,比较耗时
数据冗余 数据冗余量大
全局表 字段少 字典类型的表

3. 目前,归纳

  • 在水平扩展场景,针对这种跨分片查询的情况,使用方式解决跨分片查询。
方式 应用场景/说明
ER分片 字段多,访问频繁,数据集大
  • 得出结论!

全局表:适用于字段少的字典类型的表的场景,而order_master订单表是一个非常庞大的表,调用比较频繁,因此并不适合使用全局表的应用场景。

ER分片表,是通过ER关系来进行分片的,可以把需要两个关联的表,根据他们的关联键,把要关联的这些数据分布到同一个分片内,那么,我们在同一个分片内来解决这个关联问题,以此来,解决跨分片查询的问题

mysql  -uapp_imooc -p123456 -h192.168.92.101 -P8066mysql> select * from order_master a join order_detail b on a.order_id = b.order_id;
ERROR 1064 (HY000): invalid route in sql, multi tables found but datanode has no intersection  sql:select * from order_master a join order_detail b on a.order_id = b.order_id
mysql>


ER分片
#分别在order_db01、order_db02、order_db03、order_db04数据库中创建order_detail表


#登录node2节点,在order_db01、order_db02数据库中创建order_detail表
[root@node2 ~]# mysql -uroot -p123456
mysql> use order_db01;
mysql> use order_db02;
依次初始化创建表sql#登录node3节点,在order_db03、order_db04数据库中创建order_detail表
[root@node3 ~]# mysql -uroot -p123456
mysql> use order_db03;
mysql> use order_db04;
依次初始化创建表sql

初始化创建表sql

CREATE TABLE `order_detail` (`order_detail_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键ID,订单详情表ID',`order_id` int(10) unsigned NOT NULL COMMENT '订单表ID',`product_id` int(10) unsigned NOT NULL COMMENT '订单商品ID',`product_name` varchar(50) NOT NULL COMMENT '商品名称',`product_cnt` int(11) NOT NULL DEFAULT '1' COMMENT '购买商品数量',`product_price` decimal(8,2) NOT NULL COMMENT '购买商品单价',`average_cost` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '平均成本价格',`weight` float DEFAULT NULL COMMENT '商品重量',`fee_money` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '优惠分摊金额',`w_id` int(10) unsigned NOT NULL COMMENT '仓库ID',`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',PRIMARY KEY (`order_detail_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单详情表';

数据清理

# 删除order_master的数据
mysql  -uapp_imooc -p123456 -h192.168.92.101 -P8066
use imooc_db;
delete from order_master;

添加分片配置
修改编辑schema.xml
order_master在的table标签中添加childTable 标签,并把下面以前定义的的order_detailtable标签删除

cd /app/mycat/conf/
vim schema.xml
 <table name="order_master"          primaryKey="order_id"          dataNode="ordb01,ordb02,ordb03,ordb04" rule="order_master" autoIncrement="true"/>
<childTable name="order_detail"  primaryKey="order_detail_id" joinKey="order_id"  parentKey="order_id" autoIncrement="true" />
</table>

注:在childTable标签中,没有定义 dataNode属性,因此,说明字表和父表公用此属性

  • joinKey 父表和字表关联的键
  • parentKey 父表主键
  • primaryKey order_detail表的主键
  • autoIncrement 全局自增id 一旦开启需要在配置文件中配置才可以生效

由于order_detail配置了autoIncrement="true" 这个属性,因此,我们需要配置order_detail表的全局自增id
配置order_detail表的全局自增id

二、配置order_detail表的全局自增id

需要在sequence_db_conf.properties文件中,添加order_detail的id数据节点

cd /app/mycat/conf/
vim sequence_db_conf.properties#sequence stored in datanode
GLOBAL=mycat
ORDER_MASTER=mycat
ORDER_DETAIL=mycat

设置自增配置项‘

mysql -uroot -p123456
use mycat;# 查询现有
mysql> select * from MYCAT_SEQUENCE;
+--------------+---------------+-----------+
| name         | current_value | increment |
+--------------+---------------+-----------+
| GLOBAL       |             1 |         1 |
| ORDER_MASTER |            11 |         1 |
+--------------+---------------+-----------+# 插入新的自增配置项
mysql> insert into MYCAT_SEQUENCE values ('ORDER_DETAIL',1,1);
Query OK, 1 row affected (0.00 sec)mysql> select * from MYCAT_SEQUENCE;
+--------------+---------------+-----------+
| name         | current_value | increment |
+--------------+---------------+-----------+
| GLOBAL       |             1 |         1 |
| ORDER_DETAIL |             1 |         1 |
| ORDER_MASTER |            11 |         1 |
+--------------+---------------+-----------+
3 rows in set (0.00 sec)# 为了演示好看,将自增ID都改成从1开始,生产环境不能操作,这一步也可以不操作
mysql> update MYCAT_SEQUENCE set current_value =1 where name ='ORDER_MASTER';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from MYCAT_SEQUENCE;
+--------------+---------------+-----------+
| name         | current_value | increment |
+--------------+---------------+-----------+
| GLOBAL       |             1 |         1 |
| ORDER_DETAIL |             1 |         1 |
| ORDER_MASTER |             1 |         1 |
+--------------+---------------+-----------+
3 rows in set (0.00 sec)

重启mycat

mycat stopmycat start
# 登录mycat批量插入order_master和order_detail表的数据
mysql  -uapp_imooc -p123456 -h192.168.92.101 -P8066use imooc_db;# 初始化脚本,批量插入order_master和order_detail表的数据


从上面图的order_id中可以看出,order_master和order_detail都在通一个分片中

select a.order_id,order_sn,product_name from order_master a join order_detail b on a.order_id=b.order_id;

到此,ER跨分片查询的问题已经解决!

下一篇:企业实战_18_MyCat_ZK集群安装部署
https://gblfy.blog.csdn.net/article/details/100075631

企业实战_17_MyCat水平扩展_跨分片查询_ER分片相关推荐

  1. 企业实战_12_MyCat水平扩展_分库分表

    接上一篇:企业实战_11_MyCat垂直拆分相关配置 https://gblfy.blog.csdn.net/article/details/100055838 文章目录 一.概念理论理解 1. 垂直 ...

  2. sql跨表查询_跨表查询经常有,何为跨表更新?

    有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊? 背景 项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为 t_dept_members, ...

  3. 企业实战_18_MyCat_ZK集群安装部署

    接上一篇:企业实战_17_MyCat水平扩展_跨分片查询_ER分片 https://gblfy.blog.csdn.net/article/details/100066013 文章目录 一.使用ZK记 ...

  4. 企业实战_16_MyCat全局自增ID

    接上一篇:企业实战_15_MySql主从复制到MyCat总结 https://gblfy.blog.csdn.net/article/details/118657995 文章目录 一.准备工作 1. ...

  5. 企业实战_13_MyCat清除冗余数据

    接上一篇:企业实战_12_MyCat水平扩展_分库分表 https://gblfy.blog.csdn.net/article/details/100059793 文章目录 一.复制链路停止 1. 清 ...

  6. 企业实战_11_MyCat垂直拆分相关配置

    接上一篇:企业实战_10_MyCat Mysql 主复制总结 https://gblfy.blog.csdn.net/article/details/118652742 文章目录 一.准备工作 1. ...

  7. ES的跨索引查询有多便利?对比下分库分表、分片更直观

    作者介绍 李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发.架构.运维等方面有深入体验,实践 ...

  8. 企业实战_14_MyCat跨分片查询_全局表

    接上一篇:企业实战_13_MyCat清除冗余数据 https://gblfy.blog.csdn.net/article/details/100057317 文章目录 一.跨分片查询验证 1. 登录m ...

  9. MySQL复制与高可用水平扩展架构实战

    前言 一键获取MySQL核心数据结构.底层实现原理.索引.事务.锁机制.MySQL性能优化案例.美团MySQL中间件等. 一.什么是MySQL复制 1.什么是复制 MySQL的复制是构建大规模.高性能 ...

最新文章

  1. centOS防火墙中端口的开启和关闭
  2. AI 质检学习报告——学习篇——AI质检产生背景和发展过程
  3. 适配器模式和装饰模式
  4. 第一届大数据科学与工程国际会议(2016)征文通知
  5. ext中ArrayStore,JsonStore,XmlStore的用
  6. 并发高?可能是编译优化引发有序性问题
  7. c#调用c++ dll const char* String类型转换问题。传值,与接收返回值问题
  8. java程序设计实验结论_实验报告三
  9. 泰文Unicode编码表及排版规则
  10. 计算机网络接口 rj45类型,网卡:网线接口类型(RJ45/BNC/AUIFDDI/ATM接口) -电脑资料...
  11. qq远程听到计算机声音,QQ2017远程播放视频没有声音_软件应用_电脑知识学习_培训之家...
  12. ZPL条码及参数说明
  13. 女生做数据分析师累吗?零基础可以转行吗?
  14. 无线控制需要服务器,无线局域网无线控制器管理用户通过RADIUS服务器认证的配置-Cisco.PDF...
  15. 终于有人把 “单点“ 登录说清楚了!
  16. matlab中a2qua,matlab-toolbox-forINS 惯性导航系统的 工具箱,里面包含使用说明以及各个m文件的功能 272万源代码下载- www.pudn.com...
  17. flask开启debug调试模式
  18. 用计算机制作程序框图,流程图 结构图制作更轻松
  19. 基于回溯搜索优化算法的WSN覆盖优化
  20. iOS-控件之间的继承

热门文章

  1. DButils工具使用笔记以及常见问题总结
  2. python dir()函数使用
  3. python对象使用
  4. 找出二维数组中每行的最小数但最小数的列不能相同
  5. java集合框架总结之思维导图
  6. 21克:仅需3天,我们就用Quick BI搭建起数据驾驶舱
  7. HBase读链路分析
  8. 终端卡顿优化的全记录
  9. 基于MaxCompute InformationSchema进行血缘关系分析
  10. Logtail 混合模式:使用插件处理文件日志