【发布时间】:2009-03-20 19:32:25
【问题描述】:
MySQL 的 C API 是否支持批量更新?我正在编写一个应用程序,其中某些事务被大批量处理。如果在记录过程中我最终为每个插入执行单个调用 DB,那将非常低效。
C 是否有任何类似于 Java 的 API 用于批量 SQL 更新?
谢谢,
N.
【问题讨论】:
MySQL 的 C API 是否支持批量更新?我正在编写一个应用程序,其中某些事务被大批量处理。如果在记录过程中我最终为每个插入执行单个调用 DB,那将非常低效。
C 是否有任何类似于 Java 的 API 用于批量 SQL 更新?
谢谢,
N.
【问题讨论】:
您有几个选项可以帮助加快 MySQL 中的 INSERT:
您可以准备一个查询并使用不同的值执行它。这比为插入的每一行准备和执行查询具有更少的开销。请参阅“C API Prepared Statement Function Overview”。
您可以使用一个INSERT 语句插入多行。请参阅“INSERT Syntax”。
借助 API 支持,您可以在一次调用中执行多个语句。请参阅“C API Support for Multiple Statement Execution”。
您绝对应该使用显式事务(假设您使用 InnoDB)来避免每行启动和提交事务的开销。
“Speed of INSERT Statements”中还有其他提高INSERT速度的技巧。
通过LOAD DATA INFILE 实现批量数据加载的最佳性能。这可以比使用INSERT 快二十倍。请参阅“LOAD DATA INFILE Syntax”。
【讨论】:
是的,尽管它没有任何单独的功能。看看:
http://dev.mysql.com/doc/refman/5.0/en/c-api-multiple-queries.html
您必须指定 mysql_real_query() 应该解析多个由 ; 分隔的语句提前,通过在连接或使用mysql_set_server_option()时启用标志。
mysql_set_server_option(&mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);
这就是php实现mysqli_multi_query()的方式:
PHP_FUNCTION(mysqli_multi_query)
{
// ...
MYSQLI_ENABLE_MQ;
if (mysql_real_query(mysql->mysql, query, query_len)) {
// ...
MYSQLI_DISABLE_MQ;
// ...
RETURN_FALSE;
}
RETURN_TRUE;
}
MYSQLI_ENABLE_MQ 宏的计算结果为我在上面提供的代码。
【讨论】: