`
mengdejun
  • 浏览: 410308 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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;

  }

  }

 

分享到:
评论

相关推荐

    TP5+MySQL通用分表代码

    - 很简单,网上很多关于分表的都是含糊其辞,没有任何详细的,通用的,既然没有,那么我写一个出来吧。 - 主要目的 - 产品上线以后,数据量越来越大,当一个表有几十万上百万条记录的时候,是时候考虑分表了。...

    ThinkPHP 批量添加数据

    在处理数据时,我们通常通过模型(Model)来进行数据库的CRUD操作。 批量添加数据通常涉及到以下步骤: 1. **数据准备**:首先,你需要将要插入的数据组织成一个数组或集合。每个元素代表一条记录,包含所有字段的值...

    基于ThinkPHP5.0的各项后台小功能代码实现

    《基于ThinkPHP5.0的各项后台小功能代码实现》 ThinkPHP5.0是中国最流行的PHP框架之一,它为开发者提供了高效、简洁...提供的PDF文档应该包含更多具体的代码实例和详细解释,是深入理解ThinkPHP5.0后台功能的好资料。

    Thinkphp代码生成器

    Thinkphp代码生成器是一款强大的开发辅助工具,专为基于Thinkphp框架的Web应用程序设计。它极大地提升了开发效率,通过自动化的方式生成表单和实体类,从而减轻了开发者手动编写重复代码的工作负担。这个工具的核心...

    thinkphp5-使用SimHash进行海量内容数据查重

    本篇文章将详细探讨如何在ThinkPHP5中利用SimHash算法进行海量内容数据的查重。 SimHash是一种基于汉明距离的分布式相似性检测算法,由Charikar于2002年提出。它的核心思想是将任意长度的文本或数据转化为固定长度...

    Thinkphp批量更新数据的方法汇总

    以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_...

    分库分表代码实现和讲解

    在大数据量的场景下,传统的单数据库架构可能会面临性能瓶颈,这时就需要采用分库分表策略来提升系统处理能力。本教程将详细讲解如何使用PHP实现MySQL的分库分表,帮助你理解并掌握这一核心技能。 首先,我们来探讨...

    基于ThinkPHP的Ajax数据交互研究.pdf

    ThinkPHP 的 Ajax 引擎技术可以使用 XML、JSON、DOM 等技术来实现数据交互,它可以将数据传输到客户端,然后使用 JavaScript 进行数据处理和显示。 传统的 Ajax 数据交互和 ThinkPHP 的 Ajax 数据交互的比较: 1. ...

    李炎恢thinkphp讲义代码

    首先,ThinkPHP的核心理念是“简单而强大”,它采用模型-视图-控制器(MVC)设计模式,将业务逻辑、数据处理和用户界面分离开来,使得代码结构清晰,易于维护。讲义中的内容会涵盖如何创建控制器、模型和视图,以及...

    传智播客ThinkPHP后端代码生成器

    【传智播客ThinkPHP后端代码生成器】是一款针对ThinkPHP框架的高效开发工具,旨在简化后端代码编写过程,提高开发效率。在大型电子商城项目中,它扮演着重要角色,帮助开发者快速生成符合业务逻辑的模型、控制器、...

    thinkPHP框架实现多表查询的方法

    本文实例讲述了thinkPHP框架实现多表查询的方法。分享给大家供大家参考,具体如下: 我们可以将两个表连起来一起查询数据,我现在有两张表,一个是feedback表和member表,如图: 总目录: 上代码: $where = ...

    thinkphp5.0项目代码

    ThinkPHP5.0引入了中间件,这是一种处理请求和响应的机制,可以在不修改原有代码的情况下,插入额外的功能,如登录检查、日志记录、权限控制等。中间件让代码结构更加清晰,也易于维护和扩展。 七、错误处理与日志 ...

    TOPTP v1.0纯净版(for ThinkPHP2.1RC1)-ThinkPHP代码生成器

    或许你用ThinkPHP做网站都是把一些常用的代码保存在一个文件夹,每次都是复制,再稍作修改,这样也麻烦。 ThinkPHP做GBK编码的网站还有多处乱码。 输出提示信息会乱码,分页有乱码。错误提示有乱码。 为什么其他...

    thinkPHP实现数据库数据导出Excel表格

    这个过程展示了如何结合ThinkPHP的MVC架构和第三方库来处理复杂的业务需求,为开发者提供了一种便捷的方式将大量数据导出到Excel,便于分析和共享。在实际项目中,你还可以根据需要添加更多功能,如数据过滤、格式化...

    thinkphp5.1 系统数据备份、还原

    本篇文章将详细探讨如何在ThinkPHP5.1框架下进行系统数据的备份与还原,以及其对多数据库链接的支持。 首先,理解数据备份的重要性是必要的。数据库备份是为了防止数据丢失或损坏,它可以在系统崩溃、硬件故障、...

    基于ThinkPHP5.0的各项后台小功能代码实现.zip

    《基于ThinkPHP5.0的各项后台小功能代码实现》 ThinkPHP5.0是一款流行的、高性能的PHP框架,被广泛应用于开发复杂的Web应用程序。本资料集合了基于该框架的多种后台小功能的代码实现,旨在帮助开发者提升工作效率,...

    ThinkpHP源代码

    ThinkPHP遵循MVC(Model-View-Controller)设计模式,将业务逻辑、数据处理和用户界面分离,使得代码结构清晰,易于维护。在源代码中,你可以看到Controller、Model和View的实现,了解它们如何协同工作。 二、路由...

    ThinkPHP5代码生成器.zip_possiblyntv_thinkphp_thinkphp5_tp 生成代码

    ThinkPHP5代码生成器是由开发者自主设计并实现的,其主要功能在于自动生成模型(Model)和控制器(Controller)代码,极大地简化了开发者在项目初期的数据表模型构建和CRUD操作的编写工作。通过此工具,开发者能够...

    thinkphp 源代码chm

    《ThinkPHP 源代码详解》 在深入探讨ThinkPHP框架的内核源代码之前,首先需要...《ThinkPHP 源代码详解》的CHM帮助文档,正是为此目的而准备,它详细阐述了各个模块的实现细节,是学习ThinkPHP不可或缺的参考资料。

Global site tag (gtag.js) - Google Analytics