當(dāng)我們的數(shù)據(jù)表數(shù)據(jù)量,訪問量很大,或者是使用頻繁的時(shí)候,一個(gè)數(shù)據(jù)表已經(jīng)不能承受如此大的數(shù)據(jù)訪問和存儲,所以,為了減輕數(shù)據(jù)庫的負(fù)擔(dān),加快數(shù)據(jù)的存儲,就需要將一張表分成多張,及將一類數(shù)據(jù)存入不同的幾張表,當(dāng)分表已經(jīng)不能滿足需求是,我們還可以分庫,及用幾個(gè)數(shù)據(jù)庫存儲。
分表會(huì)隨著需求和功能的不同有不同的實(shí)現(xiàn)方法,下面是我做項(xiàng)目中的一個(gè)例子:
需求:product,product_price兩張表是一對多的關(guān)系,及產(chǎn)品和產(chǎn)品每日的價(jià)格,一個(gè)產(chǎn)品對應(yīng)幾種價(jià)格,現(xiàn)在由于產(chǎn)品表數(shù)據(jù)量很大,每天多有上百萬條數(shù)據(jù),就以天為單位對表進(jìn)行分表,以月為單位對數(shù)據(jù)庫進(jìn)行分庫,表的命名為‘product_price2014-07-20’表格式:前面是原數(shù)據(jù)庫表名,后面是日期(年-月-日).
創(chuàng)建數(shù)據(jù)庫和表的代碼如下:
function get_product_price_table(){ $db_info=array(); //這個(gè)月 $newmot_time=date("Y-m"); //今天日期 $newday_time=date("Y-m-d"); //本月數(shù)據(jù)庫,今天的表 $db_name = 'acbooking'.$newmot_time; $table_name = "product_price".$newday_time; //昨天的日期 $yesday_time = date("Y-m-d",strtotime("-1 day")); //取出昨天的數(shù)據(jù),獲取 product_price的最后id,作為新表id的起始值 $last_one_product_price = get_info('product_price_table_id',array('time'=>$yesday_time)); if($last_one_product_price['table_id_end']>0){ $table_id = $last_one_product_price['table_id_end']+1; }else{ $table_id = 1; } //創(chuàng)建數(shù)據(jù)庫
$Db_string_line = C('DB_TYPE').'://'.C('DB_USER').':'.C('DB_PWD').'@'.C('DB_HOST').'/'.$new_db_database; $DB_P=C('DB_PREFIX'); $Model=M($table,$DB_P,$Db_string_line); $db_name=$Model->execute($sql);//通過sql語句配置創(chuàng)建新數(shù)據(jù)庫新標(biāo),此處省略了sql語句
//創(chuàng)建數(shù)據(jù)表$Db_string_line = C('DB_TYPE').'://'.C('DB_USER').':'.C('DB_PWD').'@'.C('DB_HOST').'/'.$new_db_database; $DB_P=C('DB_PREFIX'); $Model=M($table,$DB_P,$Db_string_line); $table_name=$Model->execute($sql);
//返回新 數(shù)據(jù)庫,新的表 $db_info['database']=$db_name; $db_info['table']=$table_name; return $db_info;}
創(chuàng)建出分表后,即可存儲當(dāng)天的所有數(shù)據(jù),每天換一張表,執(zhí)行效率很高。。。。
PHP編程鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選