程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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