為什么要分表,分庫:
當我們的數據表數據量,訪問量非常大。或者是使用頻繁的時候,一個數據表已經不能承受如此大的數據訪問和存儲,所以,為了減輕數據庫的負擔,加快數據的存儲,就須要將一張表分成多張,及將一類數據存入不同的幾張表,當分表已經不能滿足需求是,我們還能夠分庫,及用幾個數據庫存儲。
分表會隨着需求和功能的不同有不同的實現方法。以下是我做項目中的一個樣例:
需求:product。product_price兩張表是一對多的關系,及產品和產品每日的價格,一個產品相應幾種價格,如今因為產品表數據量非常大。每天多有上百萬條數據。就以天為單位對表進行分表。以月為單位對數據庫進行分庫,表的命名為‘product_price2014-07-20’表格式:前面是原數據庫表名,后面是日期(年-月-日).
創建數據庫和表的代碼例如以下:
function get_product_price_table(){ $db_info=array(); //這個月 $newmot_time=date("Y-m"); //今天日期 $newday_time=date("Y-m-d"); //本月數據庫。今天的表 $db_name = 'acbooking'.$newmot_time; $table_name = "product_price".$newday_time; //昨天的日期 $yesday_time = date("Y-m-d",strtotime("-1 day")); //取出昨天的數據,獲取 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; } //創建數據庫
$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語句配置創建新數據庫新標,此處省略了sql語句
//創建數據表
$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);
//返回新 數據庫,新的表 $db_info['database']=$db_name; $db_info['table']=$table_name; return $db_info; }
創建出分表后,就可以存儲當天的全部數據。每天換一張表,運行效率非常高。。。。