在數據庫存放的數據很多的時(shí)候,常常對架構和數據庫優(yōu)化有一定要求,分庫分表也是其中的優(yōu)化方法之一。數據存儲在不同的數據庫中的時(shí)候,需要取得某個(gè)數據庫的連接進(jìn)行讀寫(xiě)操作,可以用下面的hash改進(jìn)過(guò)的算法實(shí)現
- function get_db_num($username){
- $db_num = 0;
- $database_split = $this->config->item('database_split');
- if(is_array($database_split)){ //在配置中已經(jīng)配置過(guò)了
- 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)); //這應該是一個(gè)hash算法,截取md5加密用戶(hù)名后的第一位并且轉化為十進(jìn)制,md5中每個(gè)char都是十六進(jìn)制數
- $gap_num = $max_num/$split_num; //得到一個(gè)職位16/2==8
-
- $k = 0; //命名一個(gè)局部變量
- 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隨機的,第一個(gè)條件滿(mǎn)足,第二個(gè)條件是和中位數比較,概率各一半,讀寫(xiě)都用此操作可以保證都在一個(gè)表中操作
- //如果第二個(gè)條件不滿(mǎn)足,$k增大,基數變?yōu)樯洗蔚谋容^值,再次比較,最終選出一個(gè)0和配置中total之間的一個(gè)值
- $k++; $base_num += $gap_num;
- }
- }
- return $db_num;
- }
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。