我需要优化该插入,因为数据来自的文件 现在有3000多行寄存器。 我想知道是否有办法更快地完成它 大概需要5分钟 抱歉我的英语很差。
while ( ! feof ( $f ) ) {
// Ler uma linha do arquivo $linha = fgetcsv ( $f, 0, $delimitador ); if (! $linha) { continue; }
$conn = $calculo->Connect ();
$conn->beginTransaction ();
$stmtOrgao = $conn->prepare("INSERT INTO orgao () values(null, ?,?)");
$dadosOrgao = array (
$linha [0],
$linha [1]
);
$stmtOrgao->execute ( $dadosOrgao );
$idOrgao = $conn->lastInsertId ();
$stmtFuncionario = $conn->prepare("insert into funcionario() values(null,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$dadosFuncionario = array(
$linha[2],$linha[3],$linha[4],$linha[5],$linha[6],$linha[7],$linha[8],$linha[9],$linha[10],$linha[11],$linha[12],
$linha[13],$linha[14],$linha[15],$linha[16],$linha[17],$linha[18],$linha[19],$linha[20],$linha[21],$linha[22],
$linha[23],$linha[24],$linha[25],$linha[26],$linha[27],$linha[28],$linha[29],$linha[30],$linha[31],$linha[32],
$linha[33],$linha[34],$linha[35],$linha[36],$linha[37],$linha[38],$linha[39],$linha[40],$linha[41],$linha[42],
$linha[43],$linha[44],$linha[45],$linha[46],$linha[47],$linha[48],$linha[49],$linha[50],$idOrgao);
$stmtFuncionario->execute($dadosFuncionario);
$idFuncionario = $conn->lastInsertId();
$stmtFolha = $conn->prepare("insert into folha () values(null,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?)");
if(preg_match("/[R$]/i", $linha[67]))
{
$separar = explode(" ", $linha[67]);
$lin = $separar[1];
}
else
{
$lin = $linha[67];
}
$dadosFolha = array(
$linha[51],$linha[52],$linha[53],$linha[54],$linha[55],$linha[56],$linha[57],$linha[58],$linha[59],$linha[60],$linha[61],
$linha[62],$linha[63],$linha[64],$linha[65],$linha[66],$lin,$linha[68],$linha[117],$linha[118],$linha[119],$linha[120],
$linha[121],$idFuncionario);
$stmtFolha->execute($dadosFolha);
$idFolha = $conn->lastInsertId();
$stmtProvento = $conn->prepare("insert into proventos () values(null, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?)");
$dadosProvento = array(
$linha[69],$linha[70],$linha[71],$linha[72],$linha[73],$linha[74],$linha[75],$linha[76],$linha[77],$linha[78],$linha[79],
$linha[80],$linha[81],$linha[82],$linha[83],$linha[84],$linha[85],$linha[86],$linha[87],$linha[88],$linha[97],$linha[98],
$linha[99],$linha[100],$linha[101],$linha[102],$linha[103],$linha[106],$linha[107],$linha[108],$linha[109],$linha[110],
$linha[111],$linha[112],$linha[113],$linha[114],$linha[116],$idFolha);
$stmtProvento->execute($dadosProvento);
$stmtDesconto = $conn->prepare("insert into descontos () values(null, ?,?,?,?,?,?,?,?,?,?,?,?)");
$dadosDesconto= array(
$linha[89],$linha[90],$linha[91],$linha[92],$linha[93],$linha[94],
$linha[95],$linha[96],$linha[104],$linha[105],$linha[115],$idFolha);
$stmtDesconto->execute($dadosDesconto);
$stmtOutros = $conn->prepare("insert into outros () values(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?)");
$dadosOutros = array(
$linha[122],$linha[123],$linha[124],$linha[125],$linha[126],$linha[127],$linha[128],$linha[129],$linha[130],$linha[131],
$linha[132],$linha[133],$linha[134],$linha[135],$linha[136],$linha[137],$linha[138],$linha[139],$linha[140],$linha[141],
$linha[142],$linha[143],$linha[144],$linha[145],$linha[146],$linha[147],$linha[148],$linha[149],$linha[150],$linha[151],
$linha[152],$linha[153],$linha[154],$linha[155],$linha[156],$linha[157],$linha[158],$linha[159],$linha[160],$linha[161],
$linha[162],$idFolha);
$stmtOutros->execute($dadosOutros);
$conn->commit();
$conn=null;
}
答案 0 :(得分:0)
首先,将所有准备语句移出while循环。它们只需要准备一次,然后随意使用多次。这将删除许多到服务器的往返。
如果您确定无法断开任何唯一键,则可以在循环之前删除键和索引,然后再重新创建它们。这比让每个插入数据库更新索引更快,但如果你不小心,可能会导致数据问题和其他问题。因此,如果性能至关重要,我只会提到这一点。