您的位置:首页 > 编程语言 > PHP开发

php + mysql 实现分表功能【copy】

2011-05-06 17:20 211 查看
为了减轻对海量数据访问时对数据库的压力我们可以这样做
1:先对数据库先进行分表(提供分库分表规则和路由规则(RouteRule简称RR))
2:对数据库分库
3:引入集群(Group)的概念,保证数据的高可用性,高安全性,解决单点问题;
4:引入负载均衡策略(LoadBalancePolicy简称LB);
5:引入读/写分离,提高数据的查询速度;
6:基于云端的分布式数据存储

我今天在php下对mysql进行了一下分表,我采用的是水平分表法。值得我们注意的是在mysql中我们使用的insert into newtabname select * from oldtabname where x between a and b (需要先自己建表)语法和在 sql server 中使用insert into 的时候一样。或者使用 create table newtabname(select * from oldtabname).newtabname是不需要我们去手动创建的。
下面提供我的一段源码,支持两种方案

<?php
// 分表
$con = mysql_connect('localhost','root','root');
mysql_select_db("test",$con);
mysql_query('set names utf8');

$sql = "select max(uid) as max from pre_common_member";
$query = mysql_query($sql,$con);
while($rs = mysql_fetch_array($query)){
$count = $rs['max'];
}

$rule = 2;
$item = ceil($count/$rule);
for($i = 1; $i<= $item; $i++){
$droptab = "DROP TABLE IF EXISTS pre_common_member".$i."";
@mysql_query($droptab,$con);

// 方案一:使用 select into时要使用先建表原则
$createtab ="CREATE TABLE pre_common_member".$i." (
`uid` mediumint(8) unsigned NOT NULL auto_increment,
`email` char(40) NOT NULL default '',
`username` char(15) NOT NULL default '',
`password` char(32) NOT NULL default '',
`status` tinyint(1) NOT NULL default '0',
`emailstatus` tinyint(1) NOT NULL default '0',
`avatarstatus` tinyint(1) NOT NULL default '0',
`videophotostatus` tinyint(1) NOT NULL default '0',
`adminid` tinyint(1) NOT NULL default '0',
`groupid` smallint(6) unsigned NOT NULL default '0',
`groupexpiry` int(10) unsigned NOT NULL default '0',
`extgroupids` char(20) NOT NULL default '',
`regdate` int(10) unsigned NOT NULL default '0',
`credits` int(10) NOT NULL default '0',
`notifysound` tinyint(1) NOT NULL default '0',
`timeoffset` char(4) NOT NULL default '',
`newpm` smallint(6) unsigned NOT NULL default '0',
`newprompt` smallint(6) unsigned NOT NULL default '0',
`accessmasks` tinyint(1) NOT NULL default '0',
`allowadmincp` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`),
KEY `email` (`email`),
KEY `groupid` (`groupid`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8";
@mysql_query($createtab,$con);
$sql2 = "INSERT INTO pre_common_member".$i." select * from pre_common_member where uid BETWEEN ".(($i-1)*$rule+1)." AND ".$i*$rule;
@mysql_query($sql2,$con);

// 方案二:替换方案 不需要值行$createtab;
//$sql2 = "create table pre_common_member".$i."(Select * from pre_common_member where uid between ".(($i-1)*$rule+1)." and ".$i*$rule.")";
@mysql_query($sql2,$con);
}

// 对数据分表的访问
function ruleAccess($id, $rule){
// 返回数据分表区间
return ceil($id/$rule);
}

$tabId = ruleAccess($_GET['id'],$rule);
$sql3 = "SELECT * FROM pre_common_member".$tabId;
$query = @mysql_query($sql3,$con);
while($rs = mysql_fetch_array($query)){
//....;
}

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: