在 Django 中做事务使事情变得更快

Do transaction in Django make things faster

我有一个 Django 应用程序。

此 Django 应用程序对 Twitter 进行 api 调用并获取我最近的 100 条推文。我需要将推文插入数据库。

我有一种方法可以对所有 100 条推文采取行动。此方法有一个 for 循环,我在其中从每个推文创建一个模型实例,并分别在每个实例上调用 instance.save()。

我发现事情变慢了,并认为事务可能会使事情变得更快。

所以在方法之外我添加了@method_decorator(transaction.atomic)。我仍然有一个 for 循环,我在其中创建模型实例并执行 instance.save() 但现在该方法用 transaction.atomic.

装饰
  1. transaction.atomic 是否应该让我更快地插入数据库?
  2. 每个 instance.save() 调用是否仍会发出数据库调用?
  3. 如果它能让事情变得更快,那又如何呢?
  1. 没有。数据库事务的目的是确保数据完整性。有关详细信息,请参阅 Wikipedia

  2. 是的。使用交易不会影响这一点。

  3. 没有。

应该使您的代码更快的是在单个查询中一次提交所有新记录,而不是一次一个。查看 Django 的 bulk_create。预测性能总是很困难,但我怀疑这会显着改善。

在原子事务中,一系列数据库操作要么全部发生,要么发生。

将方法修饰为 atomic 将保证该方法中的代码块在数据库中的原子性。如果方法成功完成,更改将提交到数据库。如果出现异常,则回滚更改。

1.根据您的用例,事务不会使您的代码更快。 事实上,它只会保证所有 tweets 将被保存到数据库或 none tweets 会在异常情况下被保存。

2。是的,每个 instance.save() 调用将是一个数据库调用。 因此,每次将有 100 个数据库调用。

3。同样,事务不会使您的用例更快。

如何让事情变得更快?

您可以使用 Django 的 bulk_create 在单个查询中创建所有 tweets

Tweet.objects.bulk_create([tweet1, tweet2, ...., tweet100]) # single query

这仅用 1 个查询就可以高效地将 tweet 个对象的列表插入到数据库中。