分库分表遇到的问题及解决

一、分布式唯一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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值