mysql分库时PHP选择连接数据库的代码

    在数据库存放的数据很多的时候,常常对架构和数据库优化有一定要求,分库分表也是其中的优化方法之一。数据存储在不同的数据库中的时候,需要取得某个数据库的连接进行读写操作,可以用下面的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;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值