在数据库存放的数据很多的时候,常常对架构和数据库优化有一定要求,分库分表也是其中的优化方法之一。数据存储在不同的数据库中的时候,需要取得某个数据库的连接进行读写操作,可以用下面的hash改进过的算法实现
function get_db_num($username){
$db_num = 0;
$database_split = $this->config->item('database_split');
if(is_array($database_split)){ //在配置中已经配置过了
if(!isset($database_split['total'])){ //配置文件中配置的分库总数
show_error('database_split miss config `totle`');
}
$max_num = 16; //最大值
$base_num = 0; //基数
$split_num = $database_split['total']; //分割值为2
$hash_num = hexdec(substr(md5($username),0,1)); //这应该是一个hash算法,截取md5加密用户名后的第一位并且转化为十进制,md5中每个char都是十六进制数
$gap_num = $max_num/$split_num; //得到一个职位16/2==8
$k = 0; //命名一个局部变量
for($i = ($gap_num-1); $i <= $max_num; $i+=$gap_num){ //从7到16每次加8
if ( ($hash_num >= $base_num) && ($hash_num <= $i) ){ $db_num = $k; break; } //hash值是1到16随机的,第一个条件满足,第二个条件是和中位数比较,概率各一半,读写都用此操作可以保证都在一个表中操作
//如果第二个条件不满足,$k增大,基数变为上次的比较值,再次比较,最终选出一个0和配置中total之间的一个值
$k++; $base_num += $gap_num;
}
}
return $db_num;
}