我有一个后台服务,可以导入django,并直接使用我的django项目的ORM。
它在一个循环中监控一些东西,经常--每隔几秒钟。它检查我的数据库中的每个用户,检查一个条件,并在此基础上设置一个标志为True或False。我的数据库中可能有数千个用户,所以这里的效率可以加起来。
while True:
time.sleep(5)
for user in User.objects.all():
if user.check():
user.flag = True
else:
user.flag = False
user.save()我使用MySQL作为我的数据库。
我好奇的是:如果某个特定用户将.flag设置为True,我是否会在每次运行user.flag = True; user.save()时都执行磁盘写操作,即使没有任何更改?或者Django或MySQL是否足够聪明,在没有任何变化的情况下不进行磁盘写入?
我假设MySQL读操作比写操作开销更低。检查user.flag的值,并仅在值实际更改时才尝试设置user.flag是否更有意义?根据我的理解,这本质上是将数据库读取交换为数据库写入(除了实际发生变化的情况,在这种情况下,首先执行读取,然后执行写入)。
注意:这只是一个基本的例子。我实际上并不是在和用户打交道。
发布于 2020-02-20 10:24:51
如果可以将check的逻辑移到.filter()子句中,那将是最好的。这样你就可以做到:
User.objects.filter(match_check, flag=False).update(flag=True)
User.objects.filter(~Q(match_check), flag=True).update(flag=False)或者,如果您可以对该值进行注释:
User.objects.annotate(
new_flag=some_check,
).exclude(flag=F('new_flag')).update(flag= ('new_flag'))否则,如果您不能,那么可以这样做:
new_flag = user.check()
if new_flag != user.flag:
user.flag = new_flag
user.save(update_fields=['flag']) # This will only update that single column.https://stackoverflow.com/questions/60311048
复制相似问题