全域性序列號是mycat提供的乙個新功能,為了實現分庫分表情況下,表的主鍵是全域性唯一,而預設的mysql的自增長主鍵無法滿足這個要求。全域性序列號的語法符合標準sql規範,其格式為:
next value for mycatseq_global
其中mycatseq_global是序列號的名字,mycat自動建立新的序列號,免去了開發的複雜度,另外,mycat也提供了乙個全域性的序列號,名稱為:mycatseq_global。
注意,mycatseq_必須大寫才能正確識別。
sql中使用說明
自定義序列號的標識為:mycatseq_*** ,其中***為具體定義的sequence的名稱,應用舉例如下:
使用預設的全域性sequence :
insert into tb1(id,name) values(next value for mycatseq_global,』micmiu.com』);
使用自定義的 sequence :
insert into tb2(id,name) values(next value for mycatseq_my1,』micmiu.com』);
獲取最新的值
select next value for mycatseq_***
注意:序列:mycatseq_mycat
配置:mycat=dn1
表為:mycat 也就是」表名「=序列號後半部分的名字(mycatseq_*** 中的***)
目前全域性序列號提供了本地檔案跟資料庫模式及本地基於時間戳演算法的三種方式:
本地檔案:
配置server.xml
0配置sequence_conf.properties
global.hisids=
global.minid=10001
global.maxid=20000
global.curid=10000
company.hisids=
company.minid=1001
company.maxid=2000
company.curid=1000
測試:資料庫方式:
配置server.xml
1配置sequence_db_conf.properties
#sequence stored in datanode
global=dn1
myst=dn1
3.資料庫本地建立指令碼:
drop table if exists 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;
– function structure formycat_seq_currval
drop function if existsmycat_seq_currval
;
delimiter ;;
create definer=root
@%
functionmycat_seq_currval
(seq_name varchar(50)) returns varchar(64) charset latin1
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 ;
– function structure formycat_seq_nextval
drop function if existsmycat_seq_nextval
;
delimiter ;;
create definer=root
@%
functionmycat_seq_nextval
(seq_name varchar(50)) returns varchar(64) charset latin1
deterministic
begin
update mycat_sequence
set current_value = current_value + increment where name = seq_name;
return mycat_seq_currval(seq_name);
end
;; delimiter ;
– function structure formycat_seq_setval
• 在某個分割槽(datanode)資料庫上建立序列號相關的**和函式,sql指令碼在doc目錄下的sequnce-sql.txt中,需要在資料庫上而非mycat上執行。
• mycat_home/conf/quence_db_conf.properties 中記錄了sequnce所存放的db對應的配置資訊。
global=dn1
company=dn1
customer=dn1
• 在sequnce表中,插入相應的sequnce記錄,並確定其初始值,以及增長步長,步長建議乙個合適的範圍,比如50-500,需要在資料庫上而非mycat上執行。
insert into mycat_sequence values (『global』, 0, 100);
• 修改sequnce的當前值為某個新值,需要在資料庫上而非mycat上執行。
select mycat_seq_curval(『global』);
測試:本地時間戳演算法:
id= 64位二進位制 (42(毫秒)+5(機器id)+5(業務編碼)+12(重複累加)
換算成十進位制為18位數的long型別,每毫秒可以併發12位二進位制的累加。
使用方式:
a. 配置server.xml
b. 在mycat下配置:sequence_time_conf.properties
workid=0-31 任意整數
dataacenterid=0-31 任意整數
多個個mycat節點下每個mycat配置的 workid,dataacenterid不同,組成唯一標識,總共支援32*32=1024種組合。
id示例:56763083475511
自增主鍵配置:
從mycat 1.3開始,支援自增長主鍵,依賴於全域性序列號機制,建議採用資料庫方式的全域性序列號,並正確設定步長,以免影響實際效能。
首先要開啟資料庫方式的全域性序列號,對於需要定義自增長主鍵的表,建立對應的全域性序列號,與table名稱同名大寫,
如customer序列名為customer,然後再 schema.xml 中對customer表的table元素增加屬性autoincrement值為true.
執行insert into customer (name,company_id,sharding_id) values (『test』,2,10000);檢視效果,
暫不支援主鍵為null如:insert into customer (id,name,company_id,sharding_id) values (null,』test』,2,10000);
應用獲得自增主鍵:
mycat自增字段和返回生成的主鍵id的經驗分享
說明:
1、mysql本身對非自增長主鍵,使用last_insert_id()是不會返回結果的,只會返回0.
2、mysql只會對定義自增長主鍵,可以用last_insert_id()返回主鍵值。
mycat目前提供了自增長主鍵功能,但是如果對應的mysql節點上資料表,沒有定義auto_increment,
那麼在mycat層呼叫last_insert_id()也是不會返回結果的。
正確使用方式如下:
1、mysql定義自增主鍵
create tablett2
(
id
int(10) unsigned not null auto_increment,
nm
int(10) unsigned not null,
primary key (id
)
) engine=myisam auto_increment=6 default charset=utf8;
2、mycat定義自增
[root@test conf]# vim schema.xml
26MyCat 自增長主鍵
mysql本身對非自增長主鍵,使用last insert id 是不會返回結果的,只會返回0 mysql只會對定義自增長主鍵,可以last insert id 返回主鍵值 mycat目前提供了自增長主鍵功能,但是如果對應的mysql節點上資料表,沒有定義auto increment,那麼在mycat...
mycat系列 mycat原理
mycat的原理並不複雜,複雜的是 如果 也不複雜,那麼早就成為乙個傳說了。mycat的原理中最重要的乙個動詞是 攔截 它攔截了使用者傳送過來的sql語句,首先對sql語句做了一些特定的分析 如分片分析 路由分析 讀寫分離分析 快取分析等,然後將此sql發往後端的真實資料庫,並將返回的結果做適當的處...
mycat是什麼 MYCAT學習2
1.mycat的使用 rule 1 的作用是什麼?指定使用的分片演算法 2 中name屬性的作用是什麼?name 屬性指定唯一的名字,用於標識不同的分片規則。內嵌的 rule 標籤則指定對物理表中的哪一列進行拆分和使用什麼分演算法 3 中columns屬性的作用是什麼?指定要拆分的列名字 4 中al...