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
