数据库的拆分

原创 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);

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

数据库优化-水平拆分 垂直拆分

通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器...
  • iloveyin
  • iloveyin
  • 2014年10月11日 17:01
  • 12348

拆分数据库

拆分数据库 全部显示 全部隐藏 如果数据库由多位用户通过网络共享,则应考虑对其进行拆分。拆分共享数据库不仅有助于提高数据库的性能,还能降低数据库文件损坏的风险。 拆分数据库...
  • wenwen_2008
  • wenwen_2008
  • 2012年12月06日 22:47
  • 1035

数据库垂直拆分 水平拆分

当我们使用读写分离、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库切分了。                  数据库切人简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数...
  • Jerome_s
  • Jerome_s
  • 2016年09月10日 08:48
  • 3922

mysql 数据库拆分与整合方案

文章整理自:http://www.linuxidc.com/Linux/2011-08/40601p2.htm1、数据切分方案当数据库比较庞大,读写操作特别是写入操作过于频繁,很难由一台服务器支撑的时...
  • changyanmanman
  • changyanmanman
  • 2015年05月18日 11:03
  • 2594

数据库水平拆分和垂直拆分区别(

数据库水平拆分和垂直拆分区别(以mysql为例) 数据库水平拆分和垂直拆分区别(以mysql为例)   案例:     简单购物系统暂设涉及如下表:...
  • zljjava
  • zljjava
  • 2014年08月07日 17:28
  • 22417

数据库拆分:横向拆分和纵向拆分

一、基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题。不太严格的讲,对于海量数据的数据库,如果是因为表多...
  • lonpo
  • lonpo
  • 2015年07月01日 21:05
  • 3135

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

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

数据库垂直拆分与水平拆分概念

垂直拆分   垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在...
  • yjh314
  • yjh314
  • 2016年06月21日 16:25
  • 715

数据拆分机制

一、 背景支付宝从2009年开始进行1111大促开始,从2009年大促600w 的交易量到2013年大促那天2亿的交易量;在这四年中,支付宝系统的容量经历了每年指数级的提升;如果需要支持这么大的容量的...
  • yushitao
  • yushitao
  • 2015年02月06日 11:04
  • 966

数据库优化-表拆分

通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器...
  • wenwen_2008
  • wenwen_2008
  • 2012年12月06日 22:44
  • 5845
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库的拆分
举报原因:
原因补充:

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