mysql数据库分库
总结下最近做项目的心得体会吧,和大家分享下:mysql数据库的分库
我们先看下数据库的分库结构:
分库大概有7,8个库(按区域分库)
config对应分库的配置(黄浦区DB_CONFIG1;浦东新区DB_CONFIG2...),黄浦区的区id是1,浦东新区的区id是2:
//model层读取分库:
class XxxModel {
/*
* 新db
*/
private function iDb($region) { // 区县id( 区县id拼接成config)
return M()->db($region, "DB_CONFIG".$region); // db函数在下面model类文件中有定义
}
/*
* 获取日志
* @param $region #区域ID
* @param $uid #用户ID
* @param $coursewareid #类课程ID
* return false|array
*/
public function getRecordByXx($region, $uid, $coursewareid) {
return $this->iDb($region)->table('xxxx_xxxx_record')->where(array("uid" => $uid, "over_time" => 0, "courseid" => $courseid))->find();
}
}
// thinkphp框架DB类库(框架自带,无需修改)
class Model {
// 当前数据库操作对象
protected $db = null;
....
/**
* 切换当前的数据库连接
* @access public
* @param integer $linkNum 连接序号
* @param mixed $config 数据库连接信息
* @param array $params 模型参数
* @return Model
*/
public function db($linkNum,$config='',$params=array()){
static $_db = array();
if(!isset($_db[$linkNum])) {
// 创建一个新的实例
if(!empty($config) && false === strpos($config,'/')) { // 支持读取配置参数
$config = C($config);
}
$_db[$linkNum] = Db::getInstance($config);
}elseif(NULL === $config){
$_db[$linkNum]->close(); // 关闭数据库连接
unset($_db[$linkNum]);
return ;
}
if(!empty($params)) {
if(is_string($params)) parse_str($params,$params);
foreach ($params as $name=>$value){
$this->setProperty($name,$value);
}
}
// 切换数据库连接
$this->db = $_db[$linkNum];
return $this;
}
}
// 构架思路:
第一:数据库分库按一定的规则分成多个数据库;
第二:在配置文件config里定个多个连接数据库配置的(如上图,对应数据库名字);
第三:model层读取等操作表的时候传入该用户的区县id来定位读取哪个数据库;
第四:在总库里建立表记录所有区县所有用户的的uid,区县id等需要跟分库里表关联的字段;
备注:这里只是提供大概的思路,具体业务流程可变更。。
预报下次要给大家分享的:php实现及大数据量的排名算法