2017-10-27 22 views
0

私は6530行のデータを照会してデータベースに挿入しました。うまくいけば、これをスピードアップする方法はありますか?これは7分かかりました。cプログラミングのスピードアップmysql_query

column_counterは私の行のサイズです。 snprintfを使用して値を文字列に変換しているので、mysql_queryはそれを受け入れます。

私は、コードを更新しました。これで、自動コミットが無効になります。私はmemsetを削除しました。私はセグメンテーションの失敗を避けるために必要と思った。すべての提案をありがとうございます。

mysql_autocommit(con, 0); 
for(i = 0; i < column_counter; i++) 
{ 
    snprintf(querystring, sizeQuerystring, 
    "INSERT INTO earnings " \ 
    "VALUES (%d, %d, %d, %d)", 
    column1[i], column2[i], column3[i], column4[i]); 
    if (mysql_query(con, querystring)) { 
     fprintf(stderr,"Insert failed\n"); 
     fprintf(stderr,"%s\n",mysql_error(con)); 
     finish_with_error(con); 
    } 
    //memset(querystring, 0, 256); 
    if(i - 1 == column_counter) 
    { 
     printf(" finished with earnings.csv \n", column_counter); 
    } 
} 
mysql_commit(con); 
+0

通常、挿入をトランザクションに入れると、速度が大幅に向上します。私はこれがMySQLでどのように動作するのか分かりません。インデックスが必要な場合は、すべての挿入が完了したらインデックスを作成してください。 – harandk

+0

@harandkループのためのものは7分かかります。あなたが何を言っているのかは分かりません。 – noobprogrammer1987

+0

に関して: 'finish_with_error(con);'は終了するか、戻る必要があります。ループを続行しないでください。 – user3629249

答えて

1

私はクエリを実行し、私のデータベースに挿入するデータの6530行を持っています。 うまくいけば、これをスピードアップする方法はありますか?これは7分かかりました。

あなたはMySQLのAPIを使用しているどのように作ることができる少なくとも2つの別個のと互換性の変更があります:あなたが同じフォームを持って実行する、とだけが異なるされているすべての挿入文以来

  • は、挿入された値には、prepared statementを作成してから再利用することができます。このような場合は、SQLを一度解析するだけで済むため、時間が大幅に節約されます。私はmysql_commit()への呼び出しを見ないので

  • 、私はあなたが自動コミットモードで動作していると仮定します。多数の文を同じトランザクション内でまとめて一度にコミットする方が効率的です。これにはdisabling autocommit modeが必要で、最後に手動コミットを行います(ループが終了した後)。それは全体的な時間に大きく貢献する可能性は低いのですが、

はまた、あなたは、ループの最後でmemset()を取り除くことができます。それは無意味です。なぜなら、次の反復で同じバイトを上書きするだけだからです。

+0

自動コミットモードを無効にしました。私は 'memset()'を削除しました。あなたは準備された声明を助けることができますか?私はドキュメントを理解するのに苦労しています。 – noobprogrammer1987

+0

noobprogrammer1987 @、[mysql_stmt_execute 'のためのドキュメント()'](https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html)は、完全な例を含みます。 –

+0

ありがとうございます。私は逃しました。 – noobprogrammer1987

0

はもう少しコーディングが必要ですが、このような単一のINSERTコマンドの複数の行は、巨大な性能向上をもたらす:利益 VALUES(%d個、%dのは、%D、%d)は、 INTO

INSERT VALUES(%d、%d、%d、%d)、 。