mysql c api:插入数字而不将它们转换为字符串

Posted

技术标签:

【中文标题】mysql c api:插入数字而不将它们转换为字符串【英文标题】:mysql c api: inserting numbers without converting them to a string 【发布时间】: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,它直接吞下我的变量。存在吗?

【问题讨论】:

【参考方案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),...)

【讨论】:

以上是关于mysql c api:插入数字而不将它们转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将图像插入项目中,而不将它们放在 Resource 文件夹中。(AppleScript 应用程序)

在熊猫系列中保留带有图案的元素而不将它们转换为列表

在跨度中显示图像而不将其转换为块级元素

打印 DataGridView 而不将其转换为位图

Java 如何在 dynamodb 中存储 JSON 对象或 JSON 数组而不将其转换为字符串?

使 MySQL 不将字符串转换为数字