mysql關於數據量大的時候分頁分批處理


前幾天遇到一個問題是,數據庫一開始有24W是信息,需要取出來,進行下載到excel中。一開始遇到的問題是,excel表格行只有65535條行數,遠遠不夠,有人說了很多其他解決方式,為了快速開發我就直接使用了導出txt文本文件的方式,解決了篩選數據的問題。但是第二天,由於XXXXX活動增量很快,一下子就到了50W左右,之前寫的程序莫名其妙的不可以使用了,老是報500的錯誤,后來按照別人講的,進行分批次處理,其實就是分頁的原理。

下面是代碼:

其中mysqli_query語句都被微擎封裝過了,可以不用注重具體的語法,看思路。

$sql = "SELECT count(id) AS count FROM `ims_lwxleon_box_data`"; //計算出總記錄數 分頁處理
$countNum = pdo_fetchall($sql);
$countNum = intval($countNum[0]['count']);//$countNum為int型總記錄數
$key = 100000; //設置每次循環取出的記錄數
$times = intval(ceil($countNum/$key)); //設置循環次數 向上取整,比如我有245000條數據,每次10W,就是循環25次
$recordList = array();
$keyTypeNum = array();

for ($i=0;$i<$times;$i++){        //循環
$original = ($i)*$key; //設置取記錄的初始點
$sql="SELECT keytype,phone FROM `ims_lwxleon_box_data` LIMIT ".$original.','.$key;  //limit查找
$res = pdo_fetchall($sql);

foreach ($res as $k => $v){
if (!in_array($v['keytype'],$recordList[$v['phone']])){
$recordList[$v['phone']][] = $v['keytype'];
$keyTypeNum[$v['phone']] += 1;
}
}
//導出1把鑰匙 2把鑰匙 3把鑰匙 4把鑰匙 5把鑰匙的數據
$oneList=array();
$twoList=array();
$threeList=array();
$fourList=array();
$fiveList=array();
foreach ($keyTypeNum as $k => $v){
switch ($v){
case 1:
$oneList[] = $k;
break;
case 2:
$twoList[] = $k;
break;
case 3:
$threeList[] = $k;
break;
case 4:
$fourList[] = $k;
break;
case 5:
$fiveList[] = $k;
break;
}
}

// print_r($recordList);exit();
$title="<tr><td>tel</td></tr>";
$keycount=intval($_GPC['keycount']);
if($keycount==1){
exportTxt('一把鑰匙擁有者',$oneList);
}elseif($keycount==2){
$twoList = array_merge($twoList,$threeList);
$twoList = array_merge($twoList,$fourList);
$twoList = array_merge($twoList,$fiveList);
exportTxt('兩把鑰匙擁有者',$twoList);
}elseif($keycount==3){
$threeList = array_merge($threeList,$fourList);
$threeList = array_merge($threeList,$fiveList);
exportTxt('三把鑰匙擁有者',$threeList);
}elseif($keycount==4){
$fourList = array_merge($fourList,$fiveList);
exportTxt('四把鑰匙擁有者',$fourList);
}elseif($keycount==5){
exportTxt('五把鑰匙擁有者',$fiveList);
}
}

//導出電話號碼    每次調用函數的時候,data的數據會自動添加在下載的文檔中
function exportTxt($name,$data){
Header( "Content-type: application/octet-stream ");
Header( "Accept-Ranges: bytes ");
header( "Content-Disposition: attachment; filename=".$name.".txt ");
header( "Expires: 0 ");
header( "Cache-Control: must-revalidate, post-check=0, pre-check=0 ");
header( "Pragma: public ");
foreach ($data as $k=>$v){
echo $v."\r\n";
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM