【问题标题】:best way to optmize insert优化插入的最佳方法
【发布时间】:2014-10-17 04:32:07
【问题描述】:

我需要优化该插入,因为数据来自的文件 现在有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;

}

【问题讨论】:

    标签: mysql pdo transactions


    【解决方案1】:

    首先,将所有准备语句移出 while 循环。它们只需要准备一次,然后根据需要多次使用。这将消除到服务器的许多往返行程。

    如果您确定自己不可能破坏任何唯一键,则可以在循环之前删除键和索引,然后在之后重新创建它们。这比让数据库在每次插入时更新索引要快,但如果您不小心,可能会导致数据问题和其他问题。所以我只在性能至关重要的情况下才提到这一点。

    【讨论】:

    • 但在每个循环中,数据来自文件的不同行,如果我取出,我将只从一行获得数据,对吧
    • 没有准备好的语句与使用数据运行语句不同。一次准备,多次运行。试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2014-07-19
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多