数据库的拆分

原创 2016年06月01日 19:41:54

在做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);

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

一分钟掌握数据库垂直拆分

  • 2017年03月01日 18:20
  • 82KB
  • 下载

数据库拆分经验

  • 2013年05月08日 11:08
  • 2KB
  • 下载

数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

http://blog.csdn.net/bluishglc/article/details/7696085 本文原文连接: http://blog.csdn.net/bluishg...

淘宝的数据库拆分(TDDL)

淘宝的数据拆分历程 系 统刚开始的时候,因为系统刚上线,用户不多,那个时候,所有的数据都放在了同一个数据库中,这个时候因为用户少压力小,一个数据库完全可以应付的了,但是 随着运营那些哥们辛苦的呐喊和...

数据库设计--库的拆分与表的分割

mysql能容忍的数量级在百万静态数据可以到千万, 所以必要的时候我们需要处理大数据的问题...

数据库分库分表(sharding)系列(一)拆分实施策略和示例演示

本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh...

数据库拆分

1 数据库拆分的兴起 在过去几年中,随着商业应用数据库事务量的大幅增长和数据库体积的增大,数据库拆分的概念已日益普及。许多在线服务供应商,软件即服务供应商(SaaS)和社交网站的成功更说明了这一点...

大型网站之存储瓶颈(数据库的垂直拆分)

原文:http://blog.jobbole.com/83768/ 一、简介 数据库的垂直拆分是一个粗粒度的拆分数据,它主要是将原来在一个数据库下的表拆分到不同的数据库里,水平拆分粒度比垂直拆分要更细...
  • hudashi
  • hudashi
  • 2016年03月30日 11:54
  • 1743

一分钟掌握数据库垂直拆分

一、缘起当数据库的数据量非常大时,水平切分和垂直拆分是两种常见的降低数据库大小,提升性能的方法。假设有用户表:user( uid bigint, name varchar(16), ...

mysql主从复制、读写分离到数据库水平拆分及库表散列

web项目最原始的情况是一台服务器只能连接一个mysql服务器(c3p0只能配置一个mysql),但随着项目的增大,这种方案明显已经不能满足需求了。 Mysql主从复制,读写分离: 上面的方案使用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库的拆分
举报原因:
原因补充:

(最多只允许输入30个字)