在 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.
装饰
- transaction.atomic 是否应该让我更快地插入数据库?
- 每个 instance.save() 调用是否仍会发出数据库调用?
- 如果它能让事情变得更快,那又如何呢?
没有。数据库事务的目的是确保数据完整性。有关详细信息,请参阅 Wikipedia。
是的。使用交易不会影响这一点。
没有。
应该使您的代码更快的是在单个查询中一次提交所有新记录,而不是一次一个。查看 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
个对象的列表插入到数据库中。
我有一个 Django 应用程序。
此 Django 应用程序对 Twitter 进行 api 调用并获取我最近的 100 条推文。我需要将推文插入数据库。
我有一种方法可以对所有 100 条推文采取行动。此方法有一个 for 循环,我在其中从每个推文创建一个模型实例,并分别在每个实例上调用 instance.save()。
我发现事情变慢了,并认为事务可能会使事情变得更快。
所以在方法之外我添加了@method_decorator(transaction.atomic)
。我仍然有一个 for 循环,我在其中创建模型实例并执行 instance.save() 但现在该方法用 transaction.atomic.
- transaction.atomic 是否应该让我更快地插入数据库?
- 每个 instance.save() 调用是否仍会发出数据库调用?
- 如果它能让事情变得更快,那又如何呢?
没有。数据库事务的目的是确保数据完整性。有关详细信息,请参阅 Wikipedia。
是的。使用交易不会影响这一点。
没有。
应该使您的代码更快的是在单个查询中一次提交所有新记录,而不是一次一个。查看 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
个对象的列表插入到数据库中。