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

   为了减轻对海量数据访问时对数据库的压力我们可以这样做
               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)){
        //....;
    }
   
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wbandzlhgod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值