Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c编程加速mysql\u查询_Mysql_C - Fatal编程技术网

c编程加速mysql\u查询

c编程加速mysql\u查询,mysql,c,Mysql,C,我有6530行数据要查询并插入数据库。有没有办法加快速度?这花了7分钟 column_counter是我的行的大小。我使用snprintf将我的值转换成字符串,以便mysql\u查询将接受它 我更新了代码。它现在禁用AUTCOMIT。我删除了记忆集。我想我需要它来避免分段错误。谢谢你的建议 mysql_autocommit(con, 0); for(i = 0; i < column_counter; i++) { snprintf(querystring, sizeQueryst

我有6530行数据要查询并插入数据库。有没有办法加快速度?这花了7分钟

column_counter是我的行的大小。我使用snprintf将我的值转换成字符串,以便mysql\u查询将接受它

我更新了代码。它现在禁用AUTCOMIT。我删除了记忆集。我想我需要它来避免分段错误。谢谢你的建议

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);
我有6530行数据要查询并插入数据库。是 有没有办法加快速度?这花了7分钟

您至少可以对MySQL API的使用方式进行两种不同且兼容的更改:

由于您正在执行的所有insert语句都具有相同的形式,并且只在插入的值上有所不同,因此您应该能够创建一个可以重用的insert语句。在这种情况下,这节省了大量时间,因为SQL只需要解析一次

因为我没有看到对mysql\u提交的调用,所以我假设您是在自动提交模式下操作的。在同一事务中将一组语句批处理在一起,然后一次提交它们通常更有效。这需要在结束时,即循环终止后,执行手动提交


此外,虽然它不太可能对总时间有多大贡献,但您可以在循环结束时去掉memset。这是毫无意义的,因为您只需要在下一次迭代中覆盖相同的字节。

需要多一点编码,但像这样的一个insert命令中的多行将带来巨大的性能提升:

计入收益 值%d,%d,%d,%d, 值%d,%d,%d,%d, .
.

通常,将插入放入事务中会显著提高速度。我不知道MySQL是如何工作的。当您需要索引时,请尝试在所有插入都完成后创建它。@harandk循环需要7分钟。不确定你要说什么做什么。关于:用errorcon完成;应该退出或返回,而不是继续运行循环;完全没有必要,因为对snprintf的调用将覆盖该值。从发布的代码来看,sizeQueryString和256似乎是相同的。所以256是一个“神奇”的数字。建议使用“sizeQueryString”而不是256I禁用自动提交模式。我删除了记忆集。你有没有可能帮助准备好的陈述?我在理解文档时遇到困难。@noobprogrammer1987,包含完整的示例。谢谢。我错过了。