如何有效地将批量数据集插入 mysql 数据库
how to efficiently insert bulk data set into mysql database
我有一些关于 symfony5 命令的问题 class 以及如何有效地插入 ca。 1000 万个条目(只有一个实体具有 Uuid 字段并且与其他实体没有任何关系)。整个噱头没有任何目的,只是为了 运行 使用 elasticsearch 进行一些测试。
现在,在插入数据时,到目前为止一切正常,但持续数小时 (20k / h)。
for ($i = 0; $i < $numberOfVochers; $i++) {
$voucher = new Voucher();
$voucher->setCode(Uuid::v4());
$voucher->setValid(new DateTime());
$this->em->persist($voucher);
$this->em->flush();
}
我应该怎么做(除了摆脱我的硬件:Macbook Pro 2,3 GHz Intel Core i5, 8GB)才能更快地完成这项工作?
一方面,您可能应该执行批量更新,例如像这样:
for ($i = 0; $i < $numberOfVochers; $i++) {
$voucher = new Voucher();
$voucher->setCode(Uuid::v4());
$voucher->setValid(new DateTime());
$this->em->persist($voucher);
if ($i % 100) {
$this->em->flush();
}
}
$this->em->flush(); // just in case the last badge was not added
此外,您应该在每次刷新后调用 $this->em->clear()
,以确保您不会 运行 出现内存问题。在您的情况下 $voucher
不依赖于先前插入的数据,因此 clear()
应该不会造成任何问题。
由于此操作是批量执行的,您现在可以更新您的命令以对创建进行分区,即不是为所有凭证调用一次命令,您可以为 1/4 的凭证启动该过程 4 次。然后你有 4 个进程执行插入,这通常会提高性能,因为每个进程可以 运行 在不同的处理器上。在您的情况下,由于每张凭证都可以独立创建,因此工作量不大。在其他情况下,您可能必须调整命令才能正确划分工作。
或者你也可以在你的命令中使用线程(不推荐)或使用像信使这样的东西将任务分成批次,为每个批次发送一条消息,然后使用一些工作人员来处理消息。
我有一些关于 symfony5 命令的问题 class 以及如何有效地插入 ca。 1000 万个条目(只有一个实体具有 Uuid 字段并且与其他实体没有任何关系)。整个噱头没有任何目的,只是为了 运行 使用 elasticsearch 进行一些测试。
现在,在插入数据时,到目前为止一切正常,但持续数小时 (20k / h)。
for ($i = 0; $i < $numberOfVochers; $i++) {
$voucher = new Voucher();
$voucher->setCode(Uuid::v4());
$voucher->setValid(new DateTime());
$this->em->persist($voucher);
$this->em->flush();
}
我应该怎么做(除了摆脱我的硬件:Macbook Pro 2,3 GHz Intel Core i5, 8GB)才能更快地完成这项工作?
一方面,您可能应该执行批量更新,例如像这样:
for ($i = 0; $i < $numberOfVochers; $i++) {
$voucher = new Voucher();
$voucher->setCode(Uuid::v4());
$voucher->setValid(new DateTime());
$this->em->persist($voucher);
if ($i % 100) {
$this->em->flush();
}
}
$this->em->flush(); // just in case the last badge was not added
此外,您应该在每次刷新后调用 $this->em->clear()
,以确保您不会 运行 出现内存问题。在您的情况下 $voucher
不依赖于先前插入的数据,因此 clear()
应该不会造成任何问题。
由于此操作是批量执行的,您现在可以更新您的命令以对创建进行分区,即不是为所有凭证调用一次命令,您可以为 1/4 的凭证启动该过程 4 次。然后你有 4 个进程执行插入,这通常会提高性能,因为每个进程可以 运行 在不同的处理器上。在您的情况下,由于每张凭证都可以独立创建,因此工作量不大。在其他情况下,您可能必须调整命令才能正确划分工作。
或者你也可以在你的命令中使用线程(不推荐)或使用像信使这样的东西将任务分成批次,为每个批次发送一条消息,然后使用一些工作人员来处理消息。