zoukankan      html  css  js  c++  java
  • 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 appindexmodel;
    use thinkModel;
    
    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 appindexcontroller;
    use thinkController;
    use appindexmodelArticle 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

  • 相关阅读:
    分割线
    PTA 乙级 1053 住房空置率 (20分) C/C++
    5.12 记录
    单词统计
    eclipse导入项目jdk版本不一样
    5.6日 项目回顾
    5.5 记录
    5.3 记录
    5.2 记录
    5.1 记录
  • 原文地址:https://www.cnblogs.com/panziwen/p/12667863.html
Copyright © 2011-2022 走看看