水平拆分7.1 范围分片(range)
比如说t3表
(1)行数非常多,2000w(1-1000w:sh11000w01-2000w:sh2)
(2)访问非常频繁,用户顺序访问较多
cp schema.xml schema.xml.1
vim schema.xml
添加:
table name="t3" dataNode="sh1,sh2" rule="auto-sharding-long" /
vim rule.xml
tableRule name="auto-sharding-long"
rule
columnsid/columns
algorithmrang-long/algorithm
/rule
function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong"
property name="mapFile"autopartition-long.txt/property
/function
vim autopartition-long.txt
0-10=0
【mysql怎么取余数 mysql取值范围】10-20=1
[root@db01 conf]# mysql -S /data/3308/mysql.sock-e "select * from taobao.t3"
[root@db01 conf]# mysql -S /data/3307/mysql.sock-e "select * from taobao.t3"
7.2 取模分片
1%3 1
2%3 2
3%3 0
4%3 1
5%3 2
任何正整数数字和N(正整数)取模,得mysql怎么取余数的值永远都是 0~N-1
id % 分片数量取模
N% 5=0-4idx
取余分片方式:分片键(一个列)与节点数量进行取余,得到余数,将数据写入对应节点
vim schema.xml
table name="t4" dataNode="sh1,sh2" rule="mod-long" /
vim rule.xml
property name="count"2/property
创建测试表:
mysql -S /data/3307/mysql.sock -e "use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock -e "use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);"
重启mycat
mycat restart
[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.52 -P8066 --default-auth=mysql_native_password
use TESTDB
insert into t4(id,name) values(1,'a');
insert into t4(id,name) values(2,'b');
insert into t4(id,name) values(3,'c');
insert into t4(id,name) values(4,'d');
insert into t4(id,name) values(6,'x'),(8,'y'),(10,'z');
分别登录后端节点查询数据
mysql -S /data/3308/mysql.sock-e "select * from taobao.t4"
mysql -S /data/3307/mysql.sock-e "select * from taobao.t4"
7.3 枚举分片 (区域、zone)
t5 表
id name telnum
1bj1212
2sh22222
3bj3333
4sh44444
5bj5555
sharding-by-intfile
vim schema.xml
table name="t5" dataNode="sh1,sh2" rule="sharding-by-intfile" /
vim rule.xml
function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"
property name="mapFile"partition-hash-int.txt/property
property name="type"1/property
/function
vimpartition-hash-int.txt 配置:
bj=0
sh=1
DEFAULT_NODE=1
mysql -S /data/3307/mysql.sock -e "use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock -e "use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);"
重启mycat
mycat restart
mysql -uroot -p123456 -h10.0.0.52 -P8066 --default-auth=mysql_native_password
use TESTDB
insert into t5(id,name) values(1,'bj');
insert into t5(id,name) values(2,'sh');
insert into t5(id,name) values(3,'bj');
insert into t5(id,name) values(4,'sh');
insert into t5(id,name) values(5,'tj');
mysql -S /data/3308/mysql.sock-e "select * from taobao.t5"
mysql -S /data/3307/mysql.sock-e "select * from taobao.t5"
7.4Mycat全局表
abcd.....
join
t
a
idnameage
1zs18sh1
idaddraid
1001bj1
1002sh2
2ls19sh2
idaddraid
1001bj1
1002sh2
t
idaddraid
1001bj1
1002sh2
使用场景:
如果你的业务中有些数据类似于数据字典 , 比如配置文件的配置,
常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,
而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,
要在所有的分片上保存一份数据即可,Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,
避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据 。
vim schema.xml
table name="t_area" primaryKey="id"type="global" dataNode="sh1,sh2" /
mysql -S /data/3307/mysql.sock -e "use taobao;create table t_area (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock -e "use taobao;create table t_area (id int not null primary key auto_increment,name varchar(20) not null);"
重启mycat
mycat restart
mysql -uroot -p123456 -h10.0.0.52 -P8066 --default-auth=mysql_native_password
mysql -S /data/3308/mysql.sock-e "select * from taobao.t_area"
mysql -S /data/3307/mysql.sock-e "select * from taobao.t_area"
7.5 E-R分片
a
join
b
ona.xx =b.yy
a
idname
1ash1
3c
2bsh2
4d
b
idaddraid
1001bj1sh1
1002sh2
1003tj3sh2
1004wh4
为mysql怎么取余数了防止跨分片join , 可以使用E-R模式
table name="a" dataNode="sh1,sh2" rule="mod-long"
childTable name="b" joinKey="aid" parentKey="id" /
/table
select * from a join b on a.id = b.aid
例子:
mysql -S /data/3308/mysql.sock -e "use taobao;create table a (id int not null primary key auto_increment,name varchar(20) not null);"
mysql -S /data/3308/mysql.sock -e "use taobao;create table b (id int not null primary key auto_increment,addr varchar(20) not null ,aid int );"
insert into b(id,addr,aid) values(1001,'bj',1);
insert into b(id,addr,aid) values(1002,'sj',3);
insert into b(id,addr,aid) values(1003,'sd',4);
insert into b(id,addr,aid) values(1004,'we',2);
insert into b(id,addr,aid) values(1005,'er',5);
========
后端数据节点数据分布:
mysql -S /data/3307/mysql.sock-e "select * from taobao.a"
mysql -S /data/3307/mysql.sock-e "select * from taobao.b"
mysql -S /data/3308/mysql.sock-e "select * from taobao.a"
mysql -S /data/3308/mysql.sock-e "select * from taobao.b"
mysql如何获取商品表中第20行之后剩余全部的行?select * from商品表 where id(SELECT MAX(id) from 商品表 limit 20)
下次提问,把表名和架构都贴出来
mysql 支持除运算么?不支持mysql怎么取余数 , 没有除运算mysql怎么取余数的
AVG(col) 返回指定列mysql怎么取余数的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col) 返回指定列的最小值
MAX(col) 返回指定列的最大值
SUM(col) 返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
MOD(x,y)返回x/y的模(余数)
mysql取模兼容算法mysql取模兼容算法?
分表方法:
1.取模算法
2.哈希算法
3.范围分表
本文针对水平分表的取模算法来分析:
1.取模实际上就是对被除数进行取余的操作 A%B=余数
2.利用用户手机尾号进行求余的操作
3.假如我们水平分表5张表,那么求余公式则为尾号/5=余数
4.这个余数就是我们的表名 , 进而得出该用户信息应该在哪张表
5.业务直接去以余数命名的该表查询信息
mysql 使用limit怎么得到第1条到剩余条的记录 , 网上查了limit 1, -1没办法通过limit是mysql的语法
select
*
from
table
limit
m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m 1条开始,取n条 。
select
*
from
tablename
limit
2,4
即取出第3条至第6条 , 4条记录
关于mysql怎么取余数和mysql取值范围的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 下载最新版苍蝇大冒险游戏,打苍蝇小游戏
- 狐妖小红娘拍摄手法是什么,狐妖小红娘手游官网下载
- redis经典面试,redis的面试题
- qqip代理,ip代理能显示的
- 格式化代码java 格式化代码idea
- postgresqllinux部署的简单介绍
- 关于房卡棋牌游戏开发的信息
- 如何做好一个亿的营销策划,一个亿怎么创业
- GO语言游戏情侣视频文案 情侣视频小游戏互动