天天看點

使用uuid替代傳統數字序列id

文章出處:http://netkiller.github.io

我一個又一個想法使用uuid 替代 數字數列id

2. 序列id 有範圍限制,如果插入失敗,id仍然會+1操作,造成浪費,達到最大值後會比較麻煩

3.考慮索引開銷,是否會影響性能,我不清楚。我認為對于btree 平衡樹增加類a-z還有“-” 使得子樹數量增加,索引應該更快。

也聽聽你的看法?

uuid_test_insert 是負責插入的時候建立uuid())

uuid_test_update 是保護uuid字段不會被修改

使用觸發器是因為,我的主鍵 primary key (`id`) 想用 uuid。  default uuid() 不允許?

create table `test` (

`id` varchar(50) not null default uuid(),

`username` varchar(250) null default null,

`values` varchar(250) null default null ,

primary key (`id`)

)

engine=innodb;

-- --------------------------------------------------------

-- 主機:                           192.168.2.1

-- 伺服器版本:                        5.5.25-log - mysql community server (gpl)

-- 伺服器作業系統:                      linux

-- heidisql 版本:                  8.0.0.4396

-- 文章出處:http://netkiller.github.io

/*!40101 set @old_character_set_client=@@character_set_client */;

/*!40101 set names utf8 */;

/*!40014 set @old_foreign_key_checks=@@foreign_key_checks, foreign_key_checks=0 */;

/*!40101 set @old_sql_mode=@@sql_mode, sql_mode='no_auto_value_on_zero' */;

-- 導出  表 test.uuid_test 結構

drop table if exists `uuid_test`;

create table if not exists `uuid_test` (

  `uuid` varchar(36) not null,

  `name` varchar(20) not null,

  primary key (`uuid`)

) engine=innodb default charset=utf8 comment='uuid 測試';

-- 資料導出被取消選擇。

-- 文章出處:http://netkiller.github.io 

-- 導出  觸發器 test.uuid_test_insert 結構

drop trigger if exists `uuid_test_insert`;

set @oldtmp_sql_mode=@@sql_mode, sql_mode='';

delimiter //

create trigger `uuid_test_insert` before insert on `uuid_test` for each row begin

if new.uuid is null or new.uuid = '' or length(new.uuid) != 36 then  

set new.uuid=uuid();  

end if;

end//

delimiter ;

set sql_mode=@oldtmp_sql_mode;

-- 導出  觸發器 test.uuid_test_update 結構

drop trigger if exists `uuid_test_update`;

create trigger `uuid_test_update` before update on `uuid_test` for each row begin

set new.uuid = old.uuid;

/*!40101 set sql_mode=ifnull(@old_sql_mode, '') */;

/*!40014 set foreign_key_checks=if(@old_foreign_key_checks is null, 1, @old_foreign_key_checks) */;

/*!40101 set character_set_client=@old_character_set_client */;

下一篇: Gearman 安裝