快速导入CSV文件到postgre

时间:2016-10-28 08:39:35

标签: php sql postgresql

我有1 000 000行的文件CSV,我需要将这些行导入到表PostgreSQL DB中,我需要尽快完成。

我尝试使用generator和fsync = off,但无论如何我都有相同的结果

现在导入时间是17秒,我如何优化代码或数据库以减少时间?

我的代码:

    <?php
    $time_start = microtime(true);
    ini_set('max_execution_time', 300);

    require_once 'db-config.php';
    function generateString($length = 15)
    {
      $chars = 'qwertyuioplkjhgfdsazxcvbnm';
      $numChars = strlen($chars);
      $string = '';
      for ($i = 0; $i < $length; $i++)
      {
        $string .= substr($chars, rand(1, $numChars) - 1, 1);
     }
      return $string;
    }



    $fileName = fopen("users.csv", 'a');


    for ($i=0; $i < 1000000 ; $i++)
    {
        $firstName = generateString(15);
        $lastName = generateString(15);
        $age = rand(10, 90);
        fputcsv($fileName, [$firstName, $lastName, (string)$age]);
    }

    fclose($fileName);

    $sql = "COPY users FROM '/home/artur/Documents/Projects/test.com/users.csv' CSV;";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();

    $time_end = microtime(true);
    $time = $time_end - $time_start;

    echo "Done! ({$time} seconds)";

1 个答案:

答案 0 :(得分:1)

删除COPY之前的所有索引和约束,然后重新创建它们。

除此之外,只有更快的硬件才能帮助您。

不要在生产中设置fsync=off。只是不要。