我有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)";
答案 0 :(得分:1)
删除COPY
之前的所有索引和约束,然后重新创建它们。
除此之外,只有更快的硬件才能帮助您。
不要在生产中设置fsync=off
。只是不要。