數據庫的拆分

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章