MySQL-分库分表详解(六)

2023-11-01

♥️作者:小刘在C站

♥️个人主页: 小刘主页 

♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生!

♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术

♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSDN让你我相遇!

前言

上章讲到MySQL-分库分表详解(五)            

目录

5.3.4 枚举分片

1). 介绍          

 2). 配置

 3). 测试

5.3.5 应用指定算法

1). 介绍

​编辑

 2). 配置

 示例说明 :

3). 测试

5.3.6 固定分片hash算法

1). 介绍

特点:

2). 配置

 约束 :

3). 测试

5.3.7 字符串hash解析算法

1). 介绍

 2). 配置

 示例说明:

 3). 测试


    

5.3.4 枚举分片

1). 介绍          

通过在配置文件中配置可能的枚举值 , 指定数据分布到不同数据节点上 , 本规则适用于按照省份、性
别、状态拆分数据等业务 。
<!-- 枚举 -->
<table name="tb_user" dataNode="dn4,dn5,dn6" rule="sharding-by-intfile-enumstatus"
/>

 2). 配置

schema.xml 中逻辑表配置:
 
<!-- 枚举 -->
<table name="tb_user" dataNode="dn4,dn5,dn6" rule="sharding-by-intfile-enumstatus"

schema.xml 中数据节点配置:
<dataNode name="dn4" dataHost="dhost1" database="itcast" />
<dataNode name="dn5" dataHost="dhost2" database="itcast" />
<dataNode name="dn6" dataHost="dhost3" database="itcast" />
rule.xml 中分片规则配置:
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<!-- 自己增加 tableRule -->
<tableRule name="sharding-by-intfile-enumstatus">
<rule>
<columns>status</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="defaultNode">2</property>
<property name="mapFile">partition-hash-int.txt</property>
</function>
partition-hash-int.txt ,内容如下 :
1=0
2=1
3=2
分片规则属性含义:

 3). 测试

配置完毕后,重新启动MyCat,然后在mycat的命令行中,执行如下SQL创建表、并插入数据,查看数据分布情况。

CREATE TABLE tb_user (
id bigint(20) NOT NULL COMMENT 'ID',
username varchar(200) DEFAULT NULL COMMENT '姓名',
status int(2) DEFAULT '1' COMMENT '1: 未启用, 2: 已启用, 3: 已关闭',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tb_user (id,username ,status) values(1,'Tom',1);
insert into tb_user (id,username ,status) values(2,'Cat',2);
insert into tb_user (id,username ,status) values(3,'Rose',3);
insert into tb_user (id,username ,status) values(4,'Coco',2);
insert into tb_user (id,username ,status) values(5,'Lily',1);
insert into tb_user (id,username ,status) values(6,'Tom',1);
insert into tb_user (id,username ,status) values(7,'Cat',2);
insert into tb_user (id,username ,status) values(8,'Rose',3);
insert into tb_user (id,username ,status) values(9,'Coco',2);
insert into tb_user (id,username ,status) values(10,'Lily',1);

5.3.5 应用指定算法

1). 介绍

运行阶段由应用自主决定路由到那个分片 , 直接根据字符子串(必须是数字)计算分片号。

 2). 配置

schema.xml 中逻辑表配置:
<!-- 应用指定算法 -->
<table name="tb_app" dataNode="dn4,dn5,dn6" rule="sharding-by-substring" /> 
schema.xml 中数据节点配置:
<dataNode name="dn4" dataHost="dhost1" database="itcast" />
<dataNode name="dn5" dataHost="dhost2" database="itcast" />
<dataNode name="dn6" dataHost="dhost3" database="itcast" /> 
rule.xml 中分片规则配置:
<tableRule name="sharding-by-substring">
<rule>
<columns>id</columns>
<algorithm>sharding-by-substring</algorithm>
</rule>
</tableRule>
<function name="sharding-by-substring"
class="io.mycat.route.function.PartitionDirectBySubString">
<property name="startIndex">0</property> <!-- zero-based -->
<property name="size">2</property>
<property name="partitionCount">3</property>
<property name="defaultPartition">0</property>
</function>
分片规则属性含义:
 示例说明 :
id=05-100000002 , 在此配置中代表根据 id 中从 startIndex=0 ,开始,截取 siz=2 位数字即
05 05 就是获取的分区,如果没找到对应的分片则默认分配到 defaultPartition

3). 测试

配置完毕后,重新启动 MyCat ,然后在 mycat 的命令行中,执行如下 SQL 创建表、并插入数据,查看数据分布情况。
CREATE TABLE tb_app (
id varchar(10) NOT NULL COMMENT 'ID',
name varchar(200) DEFAULT NULL COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tb_app (id,name) values('0000001','Testx00001');
insert into tb_app (id,name) values('0100001','Test100001');
insert into tb_app (id,name) values('0100002','Test200001');
insert into tb_app (id,name) values('0200001','Test300001');
insert into tb_app (id,name) values('0200002','TesT400001');

5.3.6 固定分片hash算法

1). 介绍

该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与
1111111111 进行位 & 运算,位与运算最小值为 0000000000,最大值为1111111111,转换为十
进制,也就是位于0-1023之间。

特点:

如果是求模,连续的值,分别分配到各个不同的分片;但是此算法会将连续的值可能分配到相同的
分片,降低事务处理的难度。
可以均匀分配,也可以非均匀分配。
分片字段必须为数字类型。

2). 配置

schema.xml 中逻辑表配置:
<!-- 固定分片hash算法 -->
<table name="tb_longhash" dataNode="dn4,dn5,dn6" rule="sharding-by-long-hash" />
schema.xml 中数据节点配置:
<dataNode name="dn4" dataHost="dhost1" database="itcast" />
<dataNode name="dn5" dataHost="dhost2" database="itcast" />
<dataNode name="dn6" dataHost="dhost3" database="itcast" />
rule.xml 中分片规则配置:
<tableRule name="sharding-by-long-hash">
<rule>
<columns>id</columns>
<algorithm>sharding-by-long-hash</algorithm>
</rule>
</tableRule>
<!-- 分片总长度为1024,count与length数组长度必须一致; -->
<function name="sharding-by-long-hash"
class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>
</function>
分片规则属性含义:
 约束 :
1). 分片长度 : 默认最大 2^10 , 1024 ;
2). count, length 的数组长度必须是一致的 ;
以上分为三个分区 :0-255,256-511,512-1023
示例说明 :

3). 测试

配置完毕后,重新启动 MyCat ,然后在 mycat 的命令行中,执行如下 SQL 创建表、并插入数据,查看数据分布情况。
CREATE TABLE tb_longhash (
id int(11) NOT NULL COMMENT 'ID',
name varchar(200) DEFAULT NULL COMMENT '名称',
firstChar char(1) COMMENT '首字母',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tb_longhash (id,name,firstChar) values(1,'七匹狼','Q');
insert into tb_longhash (id,name,firstChar) values(2,'八匹狼','B');
insert into tb_longhash (id,name,firstChar) values(3,'九匹狼','J');
insert into tb_longhash (id,name,firstChar) values(4,'十匹狼','S');
insert into tb_longhash (id,name,firstChar) values(5,'六匹狼','L');
insert into tb_longhash (id,name,firstChar) values(6,'五匹狼','W');
insert into tb_longhash (id,name,firstChar) values(7,'四匹狼','S');
insert into tb_longhash (id,name,firstChar) values(8,'三匹狼','S');
insert into tb_longhash (id,name,firstChar) values(9,'两匹狼','L');

5.3.7 字符串hash解析算法

1). 介绍

截取字符串中的指定位置的子字符串 , 进行 hash 算法, 算出分片。

 2). 配置

schema.xml 中逻辑表配置:
<!-- 字符串hash解析算法 -->
<table name="tb_strhash" dataNode="dn4,dn5" rule="sharding-by-stringhash" />
schema.xml 中数据节点配置:
<dataNode name="dn4" dataHost="dhost1" database="itcast" />
<dataNode name="dn5" dataHost="dhost2" database="itcast" />
rule.xml 中分片规则配置:
<tableRule name="sharding-by-stringhash">
<rule>
<columns>name</columns>
<algorithm>sharding-by-stringhash</algorithm>
</rule>
</tableRule>
<function name="sharding-by-stringhash"
class="io.mycat.route.function.PartitionByString">
<property name="partitionLength">512</property> <!-- zero-based -->
<property name="partitionCount">2</property>
<property name="hashSlice">0:2</property>
</function>
分片规则属性含义:
 示例说明:

 3). 测试
配置完毕后,重新启动 MyCat ,然后在 mycat 的命令行中,执行如下 SQL 创建表、并插入数据,查看数据分布情况。
create table tb_strhash(
name varchar(20) primary key,
content varchar(100)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_strhash (name,content) VALUES('T1001', UUID());
INSERT INTO tb_strhash (name,content) VALUES('ROSE', UUID());
INSERT INTO tb_strhash (name,content) VALUES('JERRY', UUID());
INSERT INTO tb_strhash (name,content) VALUES('CRISTINA', UUID());
INSERT INTO tb_strhash (name,content) VALUES('TOMCAT', UUID());

♥️关注,就是我创作的动力

♥️点赞,就是对我最大的认可

♥️这里是小刘,励志用心做好每一篇文章,谢谢大家

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL-分库分表详解(六) 的相关文章

  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • Laravel 中的 SQL 运算符是什么?

    我正在查看 Laravel 的源代码 发现了很多 Eloquent 的 SQL 运算符 我想知道其中一些是什么以及如何使用它们 不幸的是我没有找到任何文档 这是我找到的运营商vendor laravel framework src Illu
  • 像搜索一样在mysql中包含空格

    我在某些情况下使用 mysql like 关键字时遇到问题 我的要求是这样的 首先 当我搜索时 ABC 结果应该找到ABC and ABCdef但不是xyzABCdef or xyzABC 乍一看使用起来很简单ABC 但在我搜索时的情况 h
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN
  • 我们可以使用 Skip()、Take() 和 OrderBy() 控制 LINQ 表达式顺序吗

    我正在使用 LINQ to Entities 来显示分页结果 但我在组合方面遇到了问题Skip Take and OrderBy calls 一切正常 除了OrderBy 分配得太晚了 它在结果集被削减后执行Skip and Take 因此
  • MySQL 行级锁

    我不确定行级锁是如何工作的 但这是我的问题 我有一个表 T id int balance int engine InnoDB 我想锁定 ID 1 的行 所以我开始一个像这样的事务 start transaction select from
  • Yii2 从 MySQL 中的表登录的分步指南

    我开始在 Yii2 中迈出第一步 到目前为止 我已经能够编写一个应用程序并将数据库中的表连接到它 就像我在 Yii1 中学到的那样 该表是contacts我的创建视图中的表单将数据发送到数据库 没有任何问题 问题是我只能在 Yii2 内置的
  • MySQL中如何重置表的自增列

    我有一张桌子 它的第一列sl是自动递增的 填充表格后 我删除了前两行 第一个条目有sl1 是否可以重置为1维持AI 我正在使用 PHP MyAdmin ALTER TABLE tablename AUTO INCREMENT 1
  • MySQL如何在没有过程/函数的情况下执行命令块

    我尝试在 MySQL Workbench 上运行一段 SQL 命令 就像在 SQL Server 上一样 但它告诉我 声明在此位置无效 我在网上看到了各种这样的例子 我真的不明白为什么会出现这个错误 一些提示 代码 其中 SQL Serve
  • 保护存储过程

    我想知道是否有一种方法可以对某些用户隐藏存储过程的文本 我正在使用 MySQL 5 1 48 和 Net Connector 6 2 3 以及 Visual Studio 2008 SP1 我在 MySQL 中有两个用户 一个是 root
  • Laravel 4 - JOIN - 相同的列名

    我目前使用此代码从数据库中检索所需的数据 query DB table packages gt join assigned packages function join use id join gt on packages id assig
  • MySQL查看数据是否为NULL

    我需要在 Select 中放置一个 Case 来检查我添加到视图中的数据是否为 NULL 在这种情况下我希望它只输入零 或者不输入零 你的意思是这样的吗 SELECT IF field IS NULL 0 field 还有 IFNULL S
  • 如何使用索引更改表的列?

    我想将带有某些索引的表中 a 列的列大小从 varchar 200 更改为 varchar 8000 我应该如何进行 既然是VARCHAR你正在增加尺寸 然后简单地ALTER TABLE ALTER COLUMN https learn m
  • NOLOCK 和 UNCOMMITTED 之间有什么区别

    我使用 SQL Server 2012 我写了两个查询 但是它们之间有什么不同NOLOCK and UnCommitted SELECT lastname firstname FROM HR Employees with READUNCOM
  • SQL最近的命令?微软SQL

    我只是编写一个查询来查看我的客户数据库并列出他们下了多少订单等 我正在努力添加到此查询中的是只显示该电子邮件的最新 OrderID 有任何想法吗 这是我的查询 select top 1000 BuyerEMail COUNT HowMany
  • SQL Server:删除具有外键约束的行:事务可以覆盖约束吗?

    我有一些添加了外键约束的表 它们与代码生成一起使用 以在生成的存储过程中设置特定的联接 是否可以通过在事务中调用多个删除来覆盖这些约束 特别是 C 中的 TransactionScope 或者绝对需要级联删除吗 不要使用级联删除 这样可能会
  • MySQL Spatial CONTAINS 显示错误结果

    我的 MySQL 空间搜索有一个奇怪的行为 我在 GEOM 字段 葡萄牙边界 中创建了一个多边形 然后我尝试在内部找到一个点 发现没问题 下一次尝试是查找多边形外部的点 但查询仍返回 1 个找到的行 请帮忙 我做错了什么 为什么它会找到多边
  • 使用 mariaDB 将 sql 转储文件安装到 docker 容器

    我刚刚学习 docker 的基础知识 但一直停留在从本地系统导入 SQl 文件上 我使用的是 Windows 10 并允许我的 docker 容器访问我的共享驱动器 我有一个位于 D 上的 SQL 文件 我想导入到从 docker hub
  • 用于选择项目/属性列表中具有多个属性的项目的 SQL 语句是什么?

    假设我有一个表 其中列出的项目和属性如下 frog green cat furry frog nice cat 4 legs frog 4 legs 我想从项目列中选择同时具有绿色和 4 条腿属性的唯一对象 在这种情况下 我希望只返回青蛙对
  • SQL查询中的Python列表作为参数[重复]

    这个问题在这里已经有答案了 我有一个 Python 列表 比如说 l 1 5 8 我想编写一个 SQL 查询来获取列表中所有元素的数据 例如 select name from students where id IN THE LIST l

随机推荐

  • 排序1:几种基本的排序方法

    在数据结构课里 一般会将查找和排序放在一起 大部分人都会感觉查找比排序容易 但是我们研究过算法之后就会发现查找远远难于排序 因为常见的排序方法是相对固定的 而查找除了最基本的二分查找外 还包含非常广的内容 二叉树 各种树 Hash 大数据下
  • Ubuntu更新动态链接库 sudo ldconfig

    error while loading shared libraries libg2o core so cannot open shared object file No such file or directory解决方法 在build文
  • 使有prometheus监控redis,mongodb,nginx,mysql,jmx(经典推荐!)

    以下操作在CENTOS7环境 使用prometheus做监控 使用grafana做dashboard的界面展示 因prometheus自带的监控web界面图形化展示方面比较弱 推荐使用grafana集成prometheus展示 一 软件安装
  • 运维日志排序_100分_B卷_自定义排序

    运维日志排序 题目描述 运维工程师采集到某产品线网运行一天产生的日志 n 条 现需根据日志时间先后顺序对日志进行排序 日志时间格式为 H M S N H表示小时 0 23 M表示分钟 0 59 S表示秒 0 59 N表示毫秒 0 999 时
  • Ubuntu16.04安装ns3.29过程

    安装ns3过程 版本ns3 29 在ns3的官方主页 http www nsnam org 上就能看到详细的安装文档 安装方式下载二进制文档进行编译 1 1 下载 点击Download 点击左侧ns 3 29 也可以自行下载其他版本 点击截
  • 深度学习图像分割算法—FCN代码实现

    FCN 全卷积网络 原论文链接 https arxiv org pdf 1411 4038 pdf 官方源代码 https github com shelhamer fcn berkeleyvision org截图如下 data文件夹 官方
  • 中国DVR卡发展过程与趋势分析

    关于分析中国DVR发展趋势之文 在安防论坛与杂志上可以经常看到 这类文章大多数市场划人员单纯站在市场的角度来预测中国DVR的发展趋势 本文作者将以分析中国DVR发展过程为基础 结合目前视频技术领域状况 对未来1 2年中国DVR卡的发展趋势进
  • import torch出现 ctypes.CDLL(dll) self._handle=_dlopen(self._name,mode) OSError:[WinError 126]找不到指定的模块

    问题 我明明已经把 pytorch 和 torchvision 安装了 但在写程序时老是出现下图错误 显示import torch这一行就出问题了 解决 经过查阅网上各种说法 发现原来自己安装了 gpu 版本的 由于我笔记本的显卡不是英伟达
  • 基于贝叶斯的V2X通信传输数据的Trustworthiness估计

    标签 Trustworthiness Estimation 论文标题 Trustworthiness Estimation of Entities within Collective Perception 发表期刊 会议 2019 IEEE
  • Android------- IjkPlayer 源码学习目录

    在看了雷霄华的VideoEye后 发现其视图层使用的是SDL在windows上展示的 但是本人是搞Android App开发的 读其源码时 总是感觉有点不对劲 最后找到了bilibili 为移动端封装ffmpeg的框架 IjkPlayer
  • Global Average Pooling对全连接层的可替代性分析

    在NIN Network in Network 这篇论文中有很多的思想让人受益匪浅 其中之一就是全局平均池化 Global Average Pooling 对于全连接层的替代性分析 刚开始由于觉得之后的研究不需要NIN 因此就没去看论文 看
  • 第07课:生活中的代理模式——帮我拿一下快递

    用程序来模拟生活 从剧情中思考代理模式 代理模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 代理模式的优点 代理模式的缺点 应用场景 故事剧情 八月中秋已过 冬天急速飞来 一场秋雨一场寒 十场秋雨穿上棉 在下了两场秋雨之后 Ton
  • 微信小程序精通到入门---07 tabBar和导航跳转

    一 tabBar使用 tabBar就是微信小程序底部的tab框 每个框必须指定一个对应的页面 设置步骤如下 步骤1 在images文件下创建一个nav目录 并且创建了6个图片 3个tab 每个tab的active和非acitve状态各一张
  • ChatGPT+Ai绘图【stable-diffusion实战】

    ai绘图 stable diffusion生成 还有很大的提升空间 提示词1 Picture a planet where every living thing is made of light The landscapes are bre
  • 知道两数之和,然后在数组中找到,输出数组下标

    这一个是对于在一个数组当中 这个数组是给定的然后在其数组内查找两个数相加等于目标值的数 之后输出他们的数组下标 1 首先从理解题目入手 从题目中可以看出给定的数组中有几个数 然后给出目标结果值 2 根据给定的开头 c语言版 int twoS
  • Objective-C 类,数据成员,函数成员,对象,

    一 类 在ios中 类的声明和实现时分离的 也就是说不能写在同一个文件中 声明放在 文件中 实现放在 m 文件中 在实现文件中引入 h文件 import xxx h 声明一个类 import
  • Swagger简介

    欢迎访问本人博客 http wangnan tech 欢迎关注简书 点击打开链接 欢迎关注微信公众号 前言 Swagger 是一款RESTFUL接口的文档在线自动生成 功能测试功能软件 本文简单介绍了在项目中集成swagger的方法和一些常
  • git 报错 eslint --fix found some errors. Please fix them and try committing again.

    这个问题是 git add git commit m 注释 命令输入完成后的报错 eslint报错 解决 git commit no verify m 提交时的注释
  • 发票打印不全不完整的解决方案(Win10)

    发票不管怎么设置 不是二维码缺少一点 就是金额小数点后边的数字显示不全 具体原因是打印机默认纸张上A4 实际发票纸张要比A4宽度宽一点点 原来写过一篇程序方便的打印票据的控制 终于部分解决了 NET Drawing Printing中自定义
  • MySQL-分库分表详解(六)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 前言