MaxScale采用filter方式进行分表,因此需要在每个执行的语句上加上/*server_id-1*/这种标识符,以实现大表拆分
1.在PHP层级封装分库计算方法
0 && $max_server>1) {
return $merchant_id % $max_server;
}
else{
return 1;
}
}
/**
* 水平拆分数据表,采用注释方式
* @param $merchant_id 店铺ID
*/
function split_db($merchant_id){
$algorithm = C('DB_SPLIT_ALGORITHM');
$max_server = C('DB_SPLIT_MAXSERVER');
$id = 1;
switch ($algorithm) {
case "AVERAGE":
$id = split_average($merchant_id, $max_server);
break;
}
return "server_id-".$id;
}
?>
2.在所有的逻辑层代码中,数据库的Model操作上加上comment方法,示例如下
$result = $this->itemModel->where($where)
->order('outer_id desc' )
->comment(split_db($this->getApp()['id']))
->select();
return $result;
3.在maxScale层加上过滤器
[NamedServerFilter] type=filter module=namedserverfilter match=server_id-1 server=prod1 [NamedServerFilter] type=filter module=namedserverfilter match=server_id-2 server=prod2 [MyService] type=service router=readwritesplit servers=prod1,prod2 user=myuser passwd=mypasswd filters=NamedServerFilter
4.测试下吧,是不是分好了库?