【mycat】mycat水平分表

news2024/11/19 5:37:45

mycat完成水平拆分

简介

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如图:
在这里插入图片描述

选择要拆分的表

MySQL 单表存储数据条数是有瓶颈的,单表达到 100 万条数据就达到了瓶颈,会影响查询效率,需要进行水平拆分(分表)进行优化。例如:例子中的 orders、orders_detail 都已经达到 600 万行数据,需要进行分表优化。

分表字段,以 orders 表为例,可以根据不同自字段进行分表
在这里插入图片描述
修改schema.xml文件,为 orders 表设置数据节点为 dn1、dn2,并指定分片规则为mod_rule(自定义的名字):

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
		  <table name="tbl_consumer" dataNode="dn2"></table>
		  <!-- rule:水平分表得规则名称该名称可以随便定义。-->
		  <table name="tbl_orders" dataNode="dn1,dn2" rule="mod_rule"></table>

	</schema>
	
	<dataNode name="dn1" dataHost="host1" database="orders" />
	
	<dataNode name="dn2" dataHost="host2" database="consumer" />
	
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.179.131:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
	
	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM2" url="192.168.179.132:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>

主要注意的地方:
在这里插入图片描述

rule.xml中配置我们的规则

	<tableRule name="mod_rule">
		<rule>
			<columns>customer_id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- 数据库的个数 -->
		<property name="count">2</property>
	</function>

在这里插入图片描述
确保两个机器中都有相应的数据库时(本案例为:tbl_orders)

在这里插入图片描述

INSERT INTO tbl_orders values(1,101,100,100100);

报错: partition table, insert must provide ColumnList


分片表添加数据时 需要提供列的列表,如果不指定无法确定哪个值为分表的字段

我们可以通过mycat往该表中添加相关数据

INSERT INTO tbl_orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
INSERT INTO tbl_orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO tbl_orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO tbl_orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO tbl_orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO tbl_orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);

发现:
在这里插入图片描述

144是192.168.179.131, 145是192.168.179.132 图没改

Mycat 的分片 “join”

join: 联表查询

Orders 订单表已经进行分表操作了,和它关联的 orders_detail 订 单详情表如何进行 join 查询,我们要对 orders_detail 也要进行分片操作。Join 的原理如下图:

在这里插入图片描述
使用ER表解决上面的字表关联查询的问题,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION 的效率和性能问 题,根据这一思路,提出了基于E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。

修改schema.xml文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
		  <table name="tbl_consumer" dataNode="dn2"></table>
		  <!-- rule:水平分表得规则名称该名称可以随便定义。-->
		  <table name="tbl_orders" dataNode="dn1,dn2" rule="mod_rule">
			  <!-- childTale:定义子表得标签
			          name: 关联得子表名称
					  primaryKey:子表中得主键列名
					  joinKey: 子表中外键得列名
					  parentKey: 关联得父表得主键名称
			  -->
			   <childTable name="tbl_orders_detail" primaryKey="id" joinKey="order_id" parentKey="id"/>
		  </table>
	</schema>
	
	<dataNode name="dn1" dataHost="host1" database="orders" />
	
	<dataNode name="dn2" dataHost="host2" database="orders" />
	
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.179.131:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
	
	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM2" url="192.168.179.132:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>

主要注意的地方:
在这里插入图片描述

确保两个机器上都有tbl_orders_detail表

CREATE TABLE tbl_orders_detail(
 id INT AUTO_INCREMENT,
 detail VARCHAR(2000),
 order_id INT,
 PRIMARY KEY(id)
);

在这里插入图片描述

重启mycat

通过mycat往tbl_orders_detail表添加数据

INSERT INTO tbl_orders_detail(id,detail,order_id) values(7,'detail1',1);
INSERT INTO tbl_orders_detail(id,detail,order_id) VALUES(8,'detail1',2);
INSERT INTO tbl_orders_detail(id,detail,order_id) VALUES(9,'detail1',3);
INSERT INTO tbl_orders_detail(id,detail,order_id) VALUES(10,'detail1',4);
INSERT INTO tbl_orders_detail(id,detail,order_id) VALUES(11,'detail1',5);
INSERT INTO tbl_orders_detail(id,detail,order_id) VALUES(12,'detail1',6);

在这里插入图片描述

测试

在这里插入图片描述

全局表

订单数据字段表.—存放订单得状态---->支付 未支付 取消 待发货 已发货 已确认。。。。

由于订单数据字典表 再每个节点上都需要。所以我们把数据字典表定义为全局表。

什么样得表时候做全局表.

  • 变动不频繁
  • 数据量总体变化不大
  • 数据规模不大,很少有超过数十万条记录

鉴于此,Mycat 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:

  • 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
  • 全局表的查询操作,只从一个节点获取
  • 全局表可以跟任何一个表进行 JOIN 操作将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据JOIN 的难题。通过全局表+基于 E-R 关系的分片策略,Mycat 可以满足 80%以上的企业应用开发

修改schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
		  <table name="tbl_consumer" dataNode="dn2"></table>
		  <!-- rule:水平分表得规则名称该名称可以随便定义。-->
		  <table name="tbl_orders" dataNode="dn1,dn2" rule="mod_rule">
		  			  <!-- childTale:定义子表得标签
			          name: 关联得子表名称
					  primaryKey:子表中得主键列名
					  joinKey: 子表中外键得列名
					  parentKey: 关联得父表得主键名称
			  -->
			   <childTable name="tbl_orders_detail" primaryKey="id" joinKey="order_id" parentKey="id"/>
			</table>
			<!-- type:global表示全局表得意思-->
		  <table name="tbl_dict_order_type" dataNode="dn1,dn2" type="global" ></table>
	</schema>
	
	<dataNode name="dn1" dataHost="host1" database="orders" />
	
	<dataNode name="dn2" dataHost="host2" database="consumer" />
	
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.179.131:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
	
	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM2" url="192.168.179.132:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>

主要注意的地方:
在这里插入图片描述

重启mycat

确保两个服务器机器上都有tbl_dict_order_type数据库,注意:需要通过mycat创建表

CREATE TABLE tbl_dict_order_type(
 id INT AUTO_INCREMENT,
 order_type VARCHAR(200),
 PRIMARY KEY(id)
);

在这里插入图片描述

通过mycat添加数据

INSERT INTO tbl_dict_order_type(id,order_type) VALUES(101,'type1');
INSERT INTO tbl_dict_order_type(id,order_type) VALUES(102,'type2');

两个数据库中都有数据,全局表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Try Hack Me】内网专项---Wreath

THM 学习笔记 【Try Hack Me】内网专项—Wreath &#x1f525;系列专栏&#xff1a;Try Hack Me &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36d;作…

编程基础都要懂的计算机组成

学习目标: 1. 能够说出计算机有那两部分组成 2. 能够说出操作系统的作用 1.1计算机组成 计算机是可以进行数值计算和逻辑运算, 并且具有存储功能的电子机器. 计算机由硬系统件和软件系统组成. 1.1.1 硬件系统 主要分为主机和外设两部分, 是指那些构成计算机系统的物理实体,…

123456

hostname web1 bash 113.219.215.44 ctyun/Ctyun2022 cd /data/html/ tar -cvf /home/ctyun/html_zy.tar ./ mysqldump -uctyun -p --skip-lock-tables -R ultrax>ultrax_zhouyue.sql cd /etc/httpd tar -cvf /home/ctyun/httpd_zhouyue.tar ./ 关机改云主机私有网卡…

APP逆向案例之(一)过 app 更新提示

案例&#xff1a;某APP打开时提示更新 思路&#xff1a;想这是查壳看看有没有加壳&#xff0c;没有就去反编译按照提示搜索下&#xff0c;结果却是没有加壳反编译了下搜索&#xff0c;搜索不到&#xff0c;后来想到是不是网络传过来的&#xff0c;那这样是不是就要先获取本身AP…

Spring(十四)- Spring注解原理解析

文章目录一、Spring注解原理解析1. 使用xml配置扫描组件的原理解析2. 使用配置类扫描组件的原理解析一、Spring注解原理解析 1. 使用xml配置扫描组件的原理解析 使用Component等注解配置完毕后&#xff0c;要配置组件扫描才能使注解生效 ⚫ xml配置组件扫描&#xff1a; <c…

springboot RestTemplate优化 http 池化

http通信之三次握手 为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 TCP在发送新的数据之前&#xff0c;以特定的顺序将数据包的序号&#…

【LeetCode 力扣】3.无重复字符的最长子串 Java实现 滑动窗口

题目链接&#xff1a;3.无重复字符的最长子串 1 原题描述&#xff1a; 2 解题思路 初看此题&#xff0c;其实并不难理解&#xff0c;我们一共有两个指针&#xff0c;一个时我们子串的头 start &#xff0c;一个是我们子串的尾 end。我们的尾 end 依次加一&#xff0c;然后判…

dpdk 多线程 gdb + master

1、 main线程没有调用pthread_join 一、初始化 1、rte_eal_cpu_init()函数中&#xff0c;通过读取/sys/devices/system/cpu/cpuX/下的相关信息&#xff0c;确定当前系统有哪些CPU核&#xff0c;已经每个核属于哪个CPU Socket。 2、eal_parse_args()函数&#xff0c;解析-c参数…

力扣:递增子序列java

力扣&#xff1a;递增子序列java 流程: 设置一个结果集和路径path 本题不设置used而是再当前层设置一个map 递归三部曲&#xff1a; 参数和返回值&#xff1a;参数为输入数组nums&#xff0c;开始下标startindex&#xff0c;返回值为空 对path>1时的path输入结果集//放到这…

OTP语音芯片SOP8的前世今生_如九齐_硕呈_钰绅等以及国产方案KT148A

目录 一、语音芯片的形态简介 语音芯片ic的其中一个品类&#xff0c;就是SOP8封装的OTP语音芯片&#xff0c;非常的经典和常用。源头的供应商基本都是台系的原厂&#xff0c;比如&#xff1a;九齐、硕呈、佑华等等&#xff0c;其中佑华就算是鼻祖了&#xff0c;早期的4位机也是…

JSP脚本

在 JSP 中&#xff0c;可以使用 JSP 脚本写入 Java 代码。 JSP 脚本可以包含任意数量的 Java 语句&#xff0c;变量、方法和表达式。JSP 脚本会把包含的内容插入到 Servlet 的 service() 方法中。 JSP 脚本语法如下&#xff1a; <% Java语句 %> <jsp:scriptlet>J…

【kubernetes篇】使用Harbor仓库管理kubernetes镜像

引言 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;在企业级的Docker Registry管理项目中&#xff0c;一般使用Harbor&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 今天就将Harbor仓库的安装和使用做一…

【手把手】教你玩转SpringCloud Alibaba之GateWay

1、什么是GateWay 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题: - 客户端多次…

2022年亚太地区大学生数学建模竞赛/2022年亚太杯思路

解题方向&#xff1a; 回复&#xff1a;亚太 2022年第十二届亚太地区大学生数学建模竞赛(以下简称“竞赛”)是北京图象图形学学会主办的亚太地区大学生学科类竞赛&#xff0c;竞赛由亚太地区大学生数学建模竞赛组委会负责组织&#xff0c;欢迎各高等院校按照竞赛章程及有关规定…

【EC200U】何为QuecPython以及QPYcom基础操作

EC200U 何为QuecPython以及QPYcom基础操作QuecPython介绍Quec是啥MicroPythonQuecPython与MicroPython的关系QuecPython技术特性IDE(QPYcom)基础操作创建项目导入脚本方法1方法2运行脚本QuecPython是个啥&#xff0c;QPYcom怎么用? QuecPython介绍 Quec是啥 Quec 取自 Quect…

生产环境日志打印console.log内存溢出解决方法

在开发环境里面&#xff0c;开发者经常喜欢使用 console.log 进行日志打印&#xff0c;很好的提高了开发者的开发效率&#xff0c;但是这样容易产生新的问题&#xff0c;因为console的使用&#xff0c;影响内存的滥用&#xff0c;可能造成内存溢出。 分析内存上述的原因 传递…

*深入学习函数(3)-- 递归篇(图文详解)

目录 一、什么是递归 推荐两个问答社区网站 二、递归的两个必要条件 三、递归练习 1、接收一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺打印它的每一位。输入&#xff1a;1234&#xff0c;输出&#xff1a;1 2 3 4 2、编写函数不允许创建临时变量&#xff0…

rt_thread生成工程模板

系列文章目录 rt-thread 之 fal移植 文章目录系列文章目录前言一、下载ENV 和 RTT源码二、选择BSP生成模板step1 打包模板step2 修改工程模板三、添加软件包和组件step 1选择配置step 2下载软件包和组件step3 生成工程总结常见指令前言 menuconfig 图形化配置界面&#xff0c…

艾美捷Cas9核酸酶参数说明和应用

CRISPR/Cas9是细菌和古细菌在长期演化过程中形成的一种适应性免疫防御系统。CRISPR/Cas9系统通过将入侵噬菌体和质粒DNA的片段整合到CRISPR序列中&#xff0c;并利用相应的CRISPR RNAs &#xff08;crRNAs&#xff09;来指导Cas9蛋白对同源序列的降解&#xff0c;从而提供免疫性…

学习MongoTemplate操作MongoDB增删改查

学习MongoTemplate操作MongoDB增删改查一、准备1、依赖2、yml3、实体类二、案例1、增2、删3、改4、查4.1、根据Id查询数据4.2、条件查询方法4.3、模糊查询4.4、分页查询一、准备 1、依赖 <dependency><groupId>org.springframework.boot</groupId><artif…