一、分布式唯一ID
1、为什么在分布式场景下有ID问题?
- 分布式下多个数据的ID有重复情况
- 并发请求写入的时候数据库自增主键性能差,提升写入性能
设置好步长和起始值
按范围划分如下:
按hash取模划分
生成唯一ID方案:
1、Redis 可以用incrby批量取存到内存
2、Twitter雪花算法 单秒能生成几十万的ID 且不重复
二、跨库查询
1、分组方案
比如order跟userid在用一个库
Laravel+mysql拆分方案设计
hash+全局表方案设计
CREATE TABLE `index_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`uuid` varchar(32) NOT NULL DEFAULT '',
`name` varchar(25) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8;
CREATE TABLE `user_xxx` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
`age` int(11) NOT NULL,
`sex` tinyint(1) NOT NULL,
`phone` varchar(11) NOT NULL DEFAULT '',
`password` varchar(55) NOT NULL DEFAULT '',
`uuid` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
$uuid = md5(uniqid(mt_rand(), true));
$uid = hexdec(substr($uuid, 0, 1)) % 4;
DbUtil::execRawSql("insert into index_user (`uuid`,name) values ('{$uuid}','cccccc')");
DbUtil::execRawSql("insert into user_{$uid} (name,age,sex,phone,password,`uuid`)values ('cccccc',11,1,'1111111','fadsfasdfasd','{$uuid}')");
查询
$name = 'cccccc';
$result = DbUtil::get("select uuid from index_user where name='$name'");
$uid = hexdec(substr($result['uuid'], 0, 1)) % 4;
$result=DbUtil::get("select * from user_{$uid} where uuid='{$result['uuid']}'");
var_dump($result);