ThinkPHP处理海量数据分表机制详细代码及说明
来源:互联网 发布:长弓阿帕奇 知乎 编辑:程序博客网 时间:2024/05/22 12:24
应用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 f
应用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;
}
}
- ThinkPHP处理海量数据分表机制详细代码及说明
- ThinkPHP处理海量数据分表机制详细代码及说明
- ThinkPHP处理海量数据分表机制详细代码
- ThinkPHP处理海量数据分表机制详细代码
- Windows消息处理机制--详细代码说明
- thinkphp 数据分表
- C++异常处理机制详细说明
- 总结ThinkPHP导出数据到表格的几种方法及代码,分享给大家,注释超详细。
- thinkphp关联模型详细说明
- Mysql海量数据存储和解决方案之二----Mysql分表查询海量数据
- 海量数据的处理
- 处理海量数据题目~
- 处理海量数据
- 海量数据问题处理
- 如何处理海量数据
- 如何处理海量数据
- 如何处理海量数据
- 海量数据 处理方法
- 图论--在电力拓扑着色中的应用
- Delphi的WebBrowser改造,对网页中Alter等对话框的改造方法
- Oracle语句优化53个规则详解
- linux shell入门
- Cisco和H3C的两种不同动态VPN解决方案
- ThinkPHP处理海量数据分表机制详细代码及说明
- 简单设计
- C# 两PictureBox图片交换(ImageLacation) 选中边框 外部图片可直接拖入到PictureBox中显示
- 构造函数与析构函数的使用
- 来自cqx的dp神题。。
- JDBC简介
- windows7旗舰版享受优惠
- opencv中的cvWaitKey
- 摄像头驱动程序的开发修改和移植(针对嵌入式mini2440开发板)—开发文档