Стоит ли проверять перед установкой поля модели Django? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть фоновая служба, которая импортирует django и использует ORM моего проекта django напрямую.

Она отслеживает что-то, в частности, oop, очень часто - каждые несколько секунд. Он проходит через каждого пользователя в моей базе данных, проверяет условие и, основываясь на этом, устанавливает флаг в значение 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, только если значение действительно изменилось? По сути, это будет обмен чтения базы данных на запись базы данных из того, что я понимаю (за исключением случаев, когда что-то действительно изменилось, и в этом случае сначала выполняется чтение, а затем запись).

Примечание: Это просто базовый пример. Я не имею дело с пользователями.

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы можете переместить логи c из 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...