mysql - 具有多个插入的准备好的语句与常规查询

标签 mysql sql database

如果你会考虑下表

table_A (id (PK), value1, value2)

如果我要插入一组数据,例如:(1,5), (1,3), (3,5)

我可以执行如下查询:

INSERT INTO table_A (value1, value2) VALUES (1,5), (1,3), (3,5)

哪个可行。但是,有人告诉我准备好的陈述会更好。查看准备好的陈述,似乎我必须做这样的事情

$stmt = $dbh->prepare("INSERT INTO table_A (value1, value2) VALUES (?, ?)");
$stmt->bindParam(1, $value1);
$stmt->bindParam(2, $value2);

//for each set of values
$value1 = 1;
$value2 = 5;
$stmt->execute();

我的问题是,准备好的语句如何比第一种方法更好(性能方面)?一个是单个查询,另一个涉及同一查询的多次执行。第一个查询会被编译成三个单独的查询吗?

最佳答案

当您只插入一次时,准备好的语句本身不会更快。但是,如果您需要多次运行相同的插入,您将节省解析查询和准备查询计划所需的时间。准备好的语句插入将被解析一次,它的计划将被缓存,然后重新用于所有后续插入。另一方面,具有多个嵌入值的语句将需要在每次运行新语句时重新处理,从而减慢处理速度。

另一方面,网络往返也很慢。进行额外的往返可能比解析和准备查询计划要慢,因此您应该在以任何方式做出决定之前进行分析。

关于mysql - 具有多个插入的准备好的语句与常规查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188221/

相关文章:

sql - 在嵌套子查询中访问聚合

.net - SQL Server 中的 Service Broker 是什么?

java - 具有并发(多进程)访问权限的 Java 中的文件数据库

mysql命令不执行mysql

mysql - @Table 注释中的小写字母导致错误

sql - SQL Server 中数据库范围的唯一但简单的标识符

python - Alembic 无法识别 False 默认值

c# - 如何禁用 EF 代码优先中链接表的级联删除?

mysql - 如何将自动增量字段值设置为更高的数字?

mysql - 在 Laravel Eloquent 中使用 Levenshtein 函数?