关闭

数据库的拆分

标签: 数据库分表
209人阅读 评论(0) 收藏 举报
分类:

在做app推送的时候,用户数据的数据库太大了,要对其进行拆分成几个结构和原表相同的表,然后开几个线程一起推送,减少推送等待时间。经测试,每个数据库的数据量在50w的时候,读取推送速度比较好

用户主表


现在要从里面每50w数据拆分成一个新表,首先查询符合要求的用户的数据量 

得到需要建表的数量

然后用开始循环建表存数据


$this->sql = 'select count(Fid) from t_banlong_push_regdev where Fdevice=0 and Ftoken!=\'\'';
echo "sql=".$this->sql;
$count = $this->dosql('_select');
var_dump($count);
$number = $count[0]['count(Fid)']; //查询到表符合条件的数据
echo $number;
$tbnumber= round($number/$limit)+1;
echo $tbnumber;
for($i=0;$i<$tbnumber;$i++){ //分表存数据
$star = $i*$limit;
$tablename = $tablename.''.$data['Ftable'].'_'.$i.',';//表名
$sql = "CREATE TABLE ".$data['Ftable']."_".$i." (
   Fid   INT(10)  AUTO_INCREMENT PRIMARY KEY, 
Fudid VARCHAR(64) NOT NULL,
Fandroid_id VARCHAR(64) NOT NULL,
FtbdeviceID VARCHAR(64) NOT NULL,
FchannelID VARCHAR(64) NOT NULL,
Ftoken VARCHAR(64) NOT NULL,
Fdevice INT(4) NOT NULL DEFAULT'-1',
Fversion VARCHAR(64) NOT NULL,
Fip VARCHAR(32) NOT NULL,
Faddr VARCHAR(255) NOT NULL,
Faddtime INT(10) NOT NULL DEFAULT'0',
Fmodtime INT(10) NOT NULL DEFAULT'0',
Flast_pushtime INT(10) NOT NULL DEFAULT'0',
Fpush_count INT(10) NOT NULL DEFAULT'0'
)ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT =1";
echo $sql;
$re = mysql_query($sql,$this->conn);
//写入新建表数据
$this->sql = 'insert into '.$data['Ftable'].'_'.$i.' select  * from t_banlong_push_regdev where Fdevice=0 and Ftoken !=\'\' order by Fid desc limit '.$star.','.$limit;

$this->dosql('_insert');
}


以上只是基本实现功能而已,没有对数据库的操作进行优化,性能差。目前在优化中。

也可以采用这样建表读入一体的方法来复制数据 相对来说select into速度比较快用法如下

Create table Table2 (Select * from Table1);

我使用的例子如下

$sql1 = 'create table '.$data['Ftable']."_".$i.' ( select * from t_banlong_push_regdev where Faddr = \''.$data['Faddr'].'\' and Fdevice=0 and Ftoken !=\'\' order by Fid desc limit '.$star.','.$limit.')';
$re = mysql_query($sql1,$this->conn);

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18190次
    • 积分:432
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:12篇
    • 译文:0篇
    • 评论:0条
    文章分类