设计数据库的时候需要考虑到 查询效率问题,还需要考虑数据库的扩展,
当预计数据库达到某种程度的时候,设计的的时候,需要考虑分表,那么分表的原理是啥呢?
假如拿最常用的用户表作为例子,user表包含 uid ,name,age,address,然后一张表满足不了业务需要,需要分表,我们就按照uid 字段来分表,uid 是唯一的,那么当查找的时候,也需要知道uid,根据uid 来找到这个表, 其实就是一个方程,y=(未知表达式包含x);
就是设计一个函数,参数是uid ,求解table,且解是唯一的.
然后分表也有很多策略:
1 按数据大小分表,如果uid是数字的话,可以分1-2000,2000-4000,4000…..
可以很简单的用php表达:
function table($uid){
if($uid<=2000)
$table='table_a';
if($uid>2000&&$uid<=4000)
$table='table_b';
if($uid>4000)
$table='table_c';
return $table;
}
2 可以用hash策略分表
如果uid不是纯数字,可以化为数字,这种方法,但是分表后,如果想加表的时候,迁移很麻烦
crc32()函数 把
function get_hash_table( $uid, $s = 5)
{
$hash = sprintf("%u", crc32($uid));
$hash1 = intval(fmod($hash, $s));
$hash2 = sprintf("%02s", $hash1); // 这里只取2位,所以不能过100
return $table . $hash2;
}
等等 还有很多分表的方法