回覆列表
  • 1 # 使用者7407062846480

    mysql> load data infile "/tmp/mytable.csv" into table mytable; load data infile肯定是最快的.

    如果要用PHP來做,那可以考慮開啟事務,批次插入,注意避免PHP執行超時. <?php

    ignore_user_abort(true); //設定客戶端斷開連線時繼續執行指令碼

    set_time_limit(0); //設定指令碼最大執行時間,如果設定為0秒,則沒有時間方面的限制.

    //開啟事務,批次插入

    $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");

    $db->close();

    Ubuntu(i5-3230M),開啟事務時,PHP5(單程序)往SQLite插入100萬條記錄(38MB)只用16秒,平均每秒插入62500條.在/dev/shm記憶體中進行測試,PHP7耗時約9秒.

  • 中秋節和大豐收的關聯?
  • 潛山縣有多少中學?