三分钟实现程序分库分表

2014/7/6 posted in  PHP SQL

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;
}

优点与不足

这种分表方式在客户端实现,比较容易实现

不足就是需要侵入业务代码了

一些注意的点

  1. 分库/分表的核心是hash算法,这个hash算法确保了把数据均分到不同的库,并且这个hash算法是稳定的,对于同一个输入,任何时候都会只对应一个输出
  2. 分表由于id作为主键不能重复,所以id需要单独生成,一般把分表的基础表作为id生成表,每次新增数据,都会从这个表中获取新的id,一般使用mysql的SET id=LAST_INSERT_ID(id+1)实现
  3. 由于hash输入不变,输出也不变的特性,分库同样可以使用这个算法,相对分表,分库无需生成自增id了,模的结果拼接到库名后即可

参考资料

  1. https://help.aliyun.com/product/29657.html