文章插图
根据查询结果在mycat上查询是两条数据,在stt201上是北京,在stt202上是天津
范围约定分片
比如我们的用户id,将0-100000、100001-200000等这些按照范围存储,适用于范围提前规定好的场景,我们这里使用一张支付信息表为例
配置schema.xml文件
【手把手基于Mycat实现MySQL数据拆分】配置rule.xml配置文件
order_id rang-long ...... autopartition-long.txt 0修改autopartition-long.txt文件
注意:将原本有的配置删除
0-102 = 0 103-200=1重启mycat,创建表,插入数据
CREATE TABLE payment_info( id INT AUTO_INCREMENT, order_id INT, payment_status INT, PRIMARY KEY (id) ); INSERT INTO payment_info(id,order_id,payment_status) VALUES (1,101,0); INSERT INTO payment_info(id,order_id,payment_status) VALUES (2,102,1); INSERT INTO payment_info(id,order_id,payment_status) VALUES (3,103,0); INSERT INTO payment_info(id,order_id,payment_status) VALUES (4,104,1);
文章插图
我们可以看到在mycat上查询全量数据,在stt201上展示两条,在stt202上展示两条,并且数据分布也正确
按照日期分片
我们按照天进行划分,设定时间格式、范围
修改schema.xml配置文件
修改rule.xml配置文件
login_date shardingByDate ...... yyyy-MM-dd 2020-04-01 2020-04-04 2重启Mycat,创建表插入数据
CREATE TABLE login_info( id INT AUTO_INCREMENT, user_id INT, login_date date, PRIMARY KEY (id) ); INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2020-04-01'); INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2020-04-02'); INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2020-04-03'); INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2020-04-04'); INSERT INTO login_info(id,user_id,login_date) VALUES (5,103,'2020-04-05'); INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2020-04-06');
文章插图
看到效果,stt201上四条数据因为超过结束日期重新开始分区,stt202上两条数据,大家可以按照自己的想法去操作,看看是否和自己预想的效果一样,好好体会体会!到此我们完成了基于Mycat的数据库切分操作以及常用的切分方式作为参考
全局序列
在分库分表的情况下,数据库自增主键已无法保证自增主键的唯一性,为此Mycat提供了全局序列,提供了本地配置和数据库配置多种实现方式
本地文件
此方式Mycat将sequence配置到文件中,当使用到sequence中的配置后,Mycat会更新该值
- 优势:本地加载,读取速度较快
- 弊端:抗风险性差,mycat宕机无法读取配置文件,重启之后序列会重新开始,造成重复
数据库方式(推荐使用)
利用数据库的一个表来进行累加,并不是每次生成序列都读写数据库,这样太慢,Mycat会预先加载一部分到Mycat内存中,这样大部分读写都在内存中完成,如果内存中号段用完Mycat再向数据库要一次
在dn1上创建MYCAT_SEQUENCE序列表
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY(name) )ENGINE=InnoDB;创建函数获取当前sequence的值
DELIMITER $ CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name; RETURN retval; END $ DELIMITER ;创建函数设置sequence的值
DELIMITER $ CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = https://www.isolves.com/it/sjk/MYSQL/2022-11-01/value WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END $ DELIMITER ;创建函数获取下一个sequence的值
DELIMITER $ CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = https://www.isolves.com/it/sjk/MYSQL/2022-11-01/current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name); END $ DELIMITER ;
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 手把手教你如何追到天秤女
- 手把手教你在家做清蒸鲈鱼
- |手把手教你盘玩木雕把件
- 手把手教你如何清理打印机喷头 如何清洗打印头
- 手把手教你如何用手机快速将图片中文字提取出来
- 手把手教您在家蒸包子 自己在家做包子的方法
- 郭富城|郭富城手把手教小朋友写字,不到一分钟筹得近百万,每个字值23万
- 金晨|张继科金晨撒狗粮啦!张继科手把手教金晨打乒乓球,画面太甜了!
- Java探针-Java Agent技术
- 热热闹闹过圣诞,怎么布置圣诞节场景手把手教
