程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> ThinkPHP處理海量數據分表機制詳細代碼及說明

ThinkPHP處理海量數據分表機制詳細代碼及說明

編輯:PHP基礎知識
  應用ThinkPHP內置的分表算法處理百萬級用戶數據.   數據表:   house_member_0   house_member_1   house_member_2   house_member_3   模型中   class MemberModel extends AdvModel {   protected $partition = array('field'=>'username','type'=>'id','num'=>'4');   public function getDao($data=array()) {   $data = empty($data) ? $_POST : $data;   $table = $this->getPartitionTableName($data);   return $this->table($table);   }   }   方法中   class MemberAction extends BaseAction {   public function login() {   if($this->isPost()) {   $this->validToken();   $dao = D('Member')->getDao();   $res = $dao->where('username = '.$_POST['username'])->find();   // output 為自定義方法   // $isAjax - bool   $this->output(false);   }   $this->display();   }   }   /**   +----------------------------------------------------------   * 得到分表的的數據表名   +----------------------------------------------------------   * @access public   +----------------------------------------------------------   * @param array $data 操作的數據   +----------------------------------------------------------   * @return string   +----------------------------------------------------------   */   public function getPartitionTableName($data=array()) {   // 對數據表進行分區   if(isset($data[$this->partition['field']])) {   $field = $data[$this->partition['field']];   switch($this->partition['type']) {   case 'id':   // 按照id范圍分表   $step = $this->partition['expr'];   $seq = floor($field / $step)+1;   break;   case 'year':   // 按照年份分表   if(!is_numeric($field)) {   $field = strtotime($field);   }   $seq = date('Y',$field)-$this->partition['expr']+1;   break;   case 'mod':   // 按照id的模數分表   $seq = ($field % $this->partition['num'])+1;   break;   case 'md5':   // 按照md5的序列分表   $seq = (ord(substr(md5($field),0,1)) % $this->partition['num'])+1;   break;   default :   if(function_exists($this->partition['type'])) {   // 支持指定函數哈希   $fun = $this->partition['type'];   $seq = (ord(substr($fun($field),0,1)) % $this->partition['num'])+1;   }else{   // 按照字段的首字母的值分表   $seq = (ord($field{0}) % $this->partition['num'])+1;   }   }   return $this->getTableName().'_'.$seq;   }else{   // 當設置的分表字段不在查詢條件或者數據中   // 進行聯合查詢,必須設定 partition['num']   $tableName = array();   for($i=0;$i<$this->partition['num'];$i++)   $tableName[] = 'SELECT * FROM '.$this->getTableName().'_'.$i;   $tableName = '( '.implode(" UNION ",$tableName).') AS '.$this->name;   return $tableName;   }   }  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved