TP5.1分表,partition分表实例,根据自增主键水平分表

thinkphp是国内非常流行的一个PHP语言开发框架,但是在项目开发中随着数据量的不断增大,数据库已经成为影响平台发展的瓶颈问题之一,所以本文将简单分享thinkphp5下数据库的水平分表,以及分表后对数据的增删改查。以提升整体性能。

1,这里采用的是mysql单独建一张“tb_article”表来获取自增ID

CREATE TABLE `tb_article` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `stub` char(1) COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2,分表设置$rule分了3个表,建表tb_article_1,tb_article_2,tb_article_3,里面字段要一致,用来存放内容

CREATE TABLE `tb_article_1` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '文章id',
  `user_id` INT(11) NOT NULL COMMENT '作者id',
  `add_time` INT(10) DEFAULT NULL COMMENT '时间',
  `typeid` INT(1) DEFAULT NULL COMMENT '文章栏目 1财经 2娱乐 3体育',
  `title` varchar(155) NOT NULL COMMENT '文章标题',
  `content` text NOT NULL COMMENT '文章内容',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='文章表1';

3,新建模型

<?php
namespace app\index\model;
use think\Model;

class Article extends Model
{
    protected $table = 'tb_article';
    private function getRule(){
        return [
            'type' => 'mod', // 分表方式
            'num'  => 3     // 分表数量
        ];
    }
//获取插入ID,根据ID来取模分表
public function getLastId(){ $data['stub']='a'; return $this->insertGetId($data, true); } public function saveData($data, $id){ return $this->partition(['id' => $id], "id", $this->getRule())->insert($data); } public function getArticleById($where, $field = "*", $id){ return $this->partition(['id' => $id], "id", $this->getRule())->where($where)->field($field)->select(); } }

4,新建控制器

<?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Article as ArticleModel; class Article extends Controller { //分表测试 public function articleAdd(){ $Article = new ArticleModel(); $id = $Article->getLastId(); $data = [ 'id' => $id, 'user_id' => 10, 'add_time' => time(), 'typeid' => 3, 'title' => '这里是新闻标题', 'content' => '这里是新闻内容', ]; if($Article->saveData($data,$id)){
        $this->success('文章添加成功!');
} }
public function getArticle(){ $id = input('id'); if($id){ $Article = new ArticleModel(); $news = $Article->getArticleById(['id'=>$id],'*',$id); return json($news); } } }

ThinkPHP5内置了partition方法,可用于实现简单的分表。新增,修改,删除,查询单条数据时,用partition方法都可以轻松搞定,因为这些操作有一个共同的特点,就是能事先明确的知道,我要操作的是哪一条记录。但有一个需求,ThinkPHP5似乎没有解决,比如当一个大表,被拆分成若干个子表时,如何根据相关条件及排序获取分页数据。这种需求场景下,由于事先并不知道哪些数据会出现在第一页,哪些数据会出现在第二页,这些根据检索条件动态匹配的列表数据,该如何查询呢?

ThinkPHP5水平分表后分页查询解决方案:https://blog.csdn.net/tdcqfyl/article/details/82466959

 

posted @ 2020-04-09 16:38  迷离月下  阅读(3583)  评论(0编辑  收藏  举报