閱讀739 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MySQL+PHP大文件讀取和寫庫

大文件內容寫入數據庫

問題和困難

1.文件太大,數據不能一次讀取

2.數據存在冗餘,所以不能單純的插入操作

解決

1.按行讀取文件,計數累加,超過10000萬行進行寫庫操作

while ($str = fgetcsv($file)) { //每次讀取CSV裏麵的一行內容
    $str = explode("    ",$str[0]);
    $insert_data[] = array(
        'phone' => $str[0],
        'type' => $str[2],
        'number' => $str[3],
    );
    $time++;
    if ($time > 10000) {
        $value = "";
        $time = 0;
        foreach ($insert_data as $key => $item) {
            $value .= "(" . join(",",$item) ."),";
        }
        $value = trim($value,',');
        // var_dump($value);die;
        save($value,$mysqli);
        // die;
    }
}

2.寫數據庫操作,自動根據數據庫內容進行選擇插入還是修改操作

INSERT INTO table (fild)  VALUES $value ON DUPLICATE KEY UPDATE number=number+VALUES(number)

如果主鍵存在,則更新,如不存在則執行插入操作,更新時將本次數據與原有數據相加保存

其中,向MySQL寫入大量數據時,可以考慮采用PDO模式

ini_set('max_execution_time','0');
$pdo = new PDO("mysql:host=localhost;dbname=oradt_cloud1520","root","123456");

$sql = "insert into  scan_card_picture (uuid,account_id,handle_state,created_time,status,from_account,accuracy,ifupdate) values";

for($i=0; $i<100000; $i++){
  $str = strrand(32);
  $sql .="('".$str."','07:55:10','active','admin@qq.com','90',1),";
 }
$sql = substr($sql,0,strlen($sql)-1);
var_dump($sql);
if($pdo -> exec($sql)){
  echo "插入成功!";
  echo $pdo -> lastinsertid();
}

最後更新:2017-10-30 11:34:31

  上一篇:go  WCF技術剖析之二十二: 深入剖析WCF底層異常處理框架實現原理[上篇]
  下一篇:go  WCF技術剖析之二十二: 深入剖析WCF底層異常處理框架實現原理[中篇]