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