【问题标题】:mysql c api: inserting numbers without converting them to a stringmysql c api:插入数字而不将它们转换为字符串
【发布时间】:2012-01-26 11:43:27
【问题描述】:

我必须将大量整数和浮点数从 c 应用程序放入 mysql 数据库中。

目前我通过将所有这些值转换为字符串然后将它们传输到数据库来做到这一点:

char * sql_query[2048];
sprintf(sql_query, "INSERT INTO my_table VALUES (%u, %u, %d, %.7f, %u, .....");
if (mysql_real_query(&mysql, sql_query, strlen(sql_query)) {
    fprintf(stderr, "SQL Request failed: Error: %s\n", mysql_error(&mysql));
}

由于这种方式非常耗时:有没有办法避免转换为需要由 mysql 解释和转换回的字符串。 我正在寻找一个二进制 API,它直接吞下我的变量。存在吗?

【问题讨论】:

    标签: mysql c api


    【解决方案1】:

    您的 sprintf() 导致的开销将被您发送到 Mysql 的大量单个 INSERT 所掩盖(如果您不相信我,请尝试分析您的应用程序)。换句话说,如果您正在寻找更高的吞吐量,您很可能在错误的地方进行了优化。

    更好的方法是将所有记录写入 CSV 文件(我自己使用管道分隔),然后通过 LOAD DATA INFILE 加载整个批次(已针对速度进行了高度优化)。这些类型的工具已经使用了几十年,最早可以追溯到 Sybase 的 bcp(批量复制)实用程序。

    起初,看起来采取两个步骤(写入文件然后加载)会更慢,但一个巨大负载的低开销轻松地超过了用大量单个 INSERT 事务访问数据库的成本。

    我已经使用 CSV 和 LOAD DATA INFILE 快速加载了数百万条记录,从 C 或像 Ruby 这样的脚本语言同样快,因为服务器将承担大部分繁重的工作。

    Otoh,如果您只有少量记录,那么您当前的方法非常好:在架构更改或您决定移植到 Mysql 以外的服务器时,它很容易维护。

    【讨论】:

      【解决方案2】:

      你可以使用语句:

      http://dev.mysql.com/doc/refman/5.0/en/c-api-prepared-statement-type-codes.html

      http://dev.mysql.com/doc/refman/5.0/en/c-api-prepared-statement-data-structures.html

      http://dev.mysql.com/doc/refman/5.0/en/c-api-prepared-statement-function-overview.html

      但是通过将插入查询组合成一个大查询,您可能会获得更高的性能

      http://dev.mysql.com/doc/refman/5.0/en/c-api-multiple-queries.html

      因为 snprintf 的开销甚至无法与多个 mysql_real_query() 调用进行比较

      编辑:

      还注意到你没有使用snprintf(),我强烈推荐使用它:

      snprintf(query,sizeof(query),...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-06
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多