在pdo准备的语句中,是执行多个插入还是执行多个不同的插入更好/更快速?

15 浏览
0 Comments

在pdo准备的语句中,是执行多个插入还是执行多个不同的插入更好/更快速?

我需要使用PHP和PDO准备语句将每次包含19个元素的1000-30000行插入到MySQL表中。我在思考是执行多个不同的插入还是一个大的多行插入更好,例如:

INSERT INTO table (a,b,c,...) VALUES (value0a, value0b, value0c,...), (value1a, value1b, value1c,...), ..., (value10000a, value10000b, value10000c,...)

与在事务内执行每个插入比较

INSERT INTO table (a,b,c,...) VALUES (value0a, value0b, value0c,...);
INSERT INTO table (a,b,c,...) VALUES (value1a, value1b, value1c,...);
INSERT INTO table (a,b,c,...) VALUES (value2a, value2b, value2c,...);
...
INSERT INTO table (a,b,c,...) VALUES (value10000a, value10000b, value10000c,...);

看起来多行插入更好,所以我需要知道要插入多少行,并为它们创建(?,?,?,...)占位符,然后在循环中绑定它们吗?

考虑到PDOStatement::debugDumpParams()不显示参数值,我如何将整个查询作为要插入的内容输出?

0
0 Comments

问题的出现原因:

- 多次执行单个插入语句可能会导致频繁的语句解析和执行计划准备,降低性能。

- 在发送大量插入语句时,可能会出现max_packet_size大小限制的问题。

- 在循环中使用多个单个插入语句较为复杂。

解决方法:

- 使用PDO预处理语句,只需进行一次语句解析和执行计划准备。

- 将数据填充到预处理语句中,并循环执行,提供数据和执行。

- 通过启动事务、一次性执行多个插入操作,然后提交事务,可以大幅提高速度。

- 这种方法在代码复杂性和性能之间取得了良好的平衡,即使在个人电脑上,每秒也能插入数百条记录。

文章内容如下:

当您准备一条语句时,它会被词法分析一次,并准备好执行计划。剩下的工作就是填充数据。出于几个原因,这种方法要好得多:

- 一次词法分析

- 准备好的执行计划

- 您不会遇到max_packet_size的问题,因为如果您发送大量插入语句并且查询很大,MySQL可能会拒绝它

- 在循环中使用这样的语句更容易,只需提供数据并执行

速度问题与您的硬盘有关。基本上,如果您启动一个事务,发出100(或200)个插入操作,然后提交事务-您将看到速度的巨大增加。这是我们实现快速插入速率的方法之一,通过花费1个I/O并使用大量磁盘带宽。

这是代码复杂性和性能之间的一个很好的折衷。我首先使用这种方法-通常足够快。即使在个人电脑上,每秒也能插入数百条记录。

0
0 Comments

这个问题的出现是因为有人在一个问题的回答中提到了使用多行插入语句比逐行插入语句要更快。该回答引用了MySQL官方文档中的一段内容,解释了插入一行记录所需的时间由多个因素决定,其中发送查询到服务器、解析查询和插入行都是需要耗费时间的步骤。文档还提到,如果要插入多行记录,最好使用多行值列表的插入语句,这样可以减少开销,提高插入速度。

然而,有人对这段引用内容中的"overhead of 7 per insert statement"这句话提出了疑问,同时也问到了使用预处理语句的情况下该如何计算。其中有人表示这段引用内容是抄袭的,应该标记为重复问题。

然而,这个结论是错误的。实际上,使用预处理语句可以避免多次解析查询的开销,因为MySQL只需要解析一次,然后只需提供数据即可。这样可以避免很多问题,并且如果需要快速插入,可以在插入操作前后使用事务块。

因此,总结起来,使用多行插入语句比逐行插入语句更快,但使用预处理语句可以进一步提高插入速度,并避免一些潜在的问题。

0
0 Comments

问题的出现原因是频繁进行插入操作。如果需要经常进行插入操作(每天一次,一周内多次),那么尝试使用“一行多个插入”和“多行插入”的混合方式,每次连续插入5到10个插入操作。

解决方法是使用PDO预处理语句进行插入操作。根据问题描述,可以使用多个插入操作的方式,即一次性插入多行数据,或者一次性插入多个数据。这可以通过在PDO预处理语句中使用占位符和循环来实现。

以下是使用PDO预处理语句的示例代码:

// 假设已经建立了数据库连接
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
// 准备插入语句
$sql = "INSERT INTO table_name (column1, column2) VALUES (:value1, :value2)";
// 准备插入的数据
$data = array(
    array('value1' => 'data1', 'value2' => 'data2'),
    array('value1' => 'data3', 'value2' => 'data4'),
    // 可以继续添加更多的数据行
);
// 开始事务
$pdo->beginTransaction();
// 执行插入操作
$stmt = $pdo->prepare($sql);
foreach ($data as $row) {
    $stmt->execute($row);
}
// 提交事务
$pdo->commit();

通过以上代码,可以实现一次性插入多行数据,从而提高插入操作的效率。

总结起来,对于频繁进行插入操作的情况,使用PDO预处理语句和一次性插入多行数据的方式可以提高插入操作的效率。

0