首頁  >  文章  >  後端開發  >  做一個導入csv資料的網頁,有幾十百萬個資料應該用什麼方案或考慮哪些問題?

做一個導入csv資料的網頁,有幾十百萬個資料應該用什麼方案或考慮哪些問題?

WBOY
WBOY原創
2016-12-05 13:44:201441瀏覽

想用PHP做一個如題的網頁,新手不知道怎麼入手,之前做一個簡單的上傳,但資料只有幾千條,現在要處理上百萬條資料導入,應該如何解決。會Python 但是Python太折騰打算用PHP。請教一下各位大神~

回覆內容:

想用PHP做一個如題的網頁,新手不知道怎麼入手,之前做一個簡單的上傳,但資料只有幾千條,現在要處理上百萬條資料導入,應該如何解決。會Python 但是Python太折騰打算用PHP。請教一下各位大神~

效率問題的話。拼接成串類似 insert into...value(),value()這樣>事務>>循環插入。注意一點就是一次插入很多資料 要修改mysql或其他資料庫允許一次插入的最大資料量的配置。我剛剛試了一下 一次插入10萬條 用第一種方法大概4秒(5字段這樣的表)

資料量比較大, 可以分批次導入, 用ajax反覆請求上傳介面, 每次請求傳遞不同參數.
如:

www.xxx.com/upload.php?offset=0&length=1000

www.xxx.com/upload.php?offset=1000&length=1000

這樣不至於讓PHP腳本運行超時.

對於插入的語句優化,以及表結構有較大要求,不然會慢的可怕,合併資料+事務+有序資料的方式會比較高效

先把CSV表格上傳到伺服器.
然後PHP把CSV表格導入MySQL資料庫:

<code><?php
//开启事务,批量插入
$db = new mysqli('127.0.0.1','user','pass','dbname',3306);
$db->query('SET AUTOCOMMIT=0');
$db->query('START TRANSACTION');

//导入CSV表格:CSV转数组
$fp = fopen('file.csv', 'r');
while ( ($row = fgetcsv($fp)) !== FALSE ) {
    //从文件指针中读入一行并解析CSV
    $stmt = $db->prepare('INSERT INTO posts (id, post_title, post_content) VALUES (?,?,?)');
    $stmt->bind_param('iss', $row[0], $row[1], $row[2]); //这里假设每行内容分别为ID,标题和内容
    $stmt->execute();
    //如果插入失败,改为更新
    if($stmt->affected_rows == 0) {
        $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
        $stmt->bind_param('ssi', $row[1], $row[2], $row[0]);
        $stmt->execute();
        if($stmt->affected_rows == 0) {
            echo 'Import '.$row[0].' failed!'."\n";
        }
    }
}
fclose($fp);

//提交事务
$db->query('COMMIT'); //失败的操作已经echo输出来了,不需要回滚ROLLBACK
$db->query('SET AUTOCOMMIT=1');</code>

非同步吧,同步幾百萬受不了吧

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn