如何有效地将批量数据集插入 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 个进程执行插入,这通常会提高性能,因为每个进程可以 运行 在不同的处理器上。在您的情况下,由于每张凭证都可以独立创建,因此工作量不大。在其他情况下,您可能必须调整命令才能正确划分工作。

或者你也可以在你的命令中使用线程(不推荐)或使用像信使这样的东西将任务分成批次,为每个批次发送一条消息,然后使用一些工作人员来处理消息。