hash算法选择
取模
比如分2个表,按user_id分,比如user_id=3, 和2取模结果是1,那么就分到表1,如果user_id=4,和2取模是0,那么就分到表0
这个时候就有三个表了,比如post表
表名 | 作用 |
---|---|
post | 基础表,用来生成自增id |
post_0 | 分表中的第一个表 |
post_1 | 分表中的第二个表 |
function shard_hash($keyword, $n) {
return $keyword % $n;
}
crc32
为了使得数据分配更平均,可以使用crc32算法得到一个大数,然后再取模
function shard_hash($keyword, $n) {
return (sprintf("%u", crc32($keyword)) >> 16 & 0x7fff) % $n;
}
优点与不足
这种分表方式在客户端实现,比较容易实现
不足就是需要侵入业务代码了
一些注意的点
- 分库/分表的核心是hash算法,这个hash算法确保了把数据均分到不同的库,并且这个hash算法是稳定的,对于同一个输入,任何时候都会只对应一个输出
- 分表由于id作为主键不能重复,所以id需要单独生成,一般把分表的基础表作为id生成表,每次新增数据,都会从这个表中获取新的id,一般使用mysql的
SET id=LAST_INSERT_ID(id+1)
实现 - 由于hash输入不变,输出也不变的特性,分库同样可以使用这个算法,相对分表,分库无需生成自增id了,模的结果拼接到库名后即可