Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
Помогите оптимизировать следующий запрос
UPDATE UserDinos SET
life=IF(life - round((UNIX_TIMESTAMP()-startTime)/60)>0, life - round((UNIX_TIMESTAMP()-startTime)/60), 0),
food=IF(food - round((UNIX_TIMESTAMP()-startTime)/60)>0, food - round((UNIX_TIMESTAMP()-startTime)/60), 0),
startTime=UNIX_TIMESTAMP(),
lifeTime=IF(life - round((UNIX_TIMESTAMP()-startTime)/60)>0, 0, UNIX_TIMESTAMP()),
foodTime=IF(food - round((UNIX_TIMESTAMP()-startTime)/60)>0, 0, UNIX_TIMESTAMP())
WHERE zooId=1 and life>0;
сейчас идет активный тест приложения с использованием данного запроса.
По структуре каждый пользователь вызывает его примерно раз в минуту.
Уже сейчас ждать ответа от сервера приходится довольно долго
Неактивен
Судя по структуре запроса, оно обновляет всех живых динозавров всех
пользователей, поэтому было бы логично вызывать его не раз в минуту
для каждого пользователя, а раз в минуту.
Ну или добавить еще WHERE user = :user: и индекс, соответственно, на
(user, zooId, life).
Неактивен
Он обновляет не всех а только по конкретному зоопраку
WHERE zooId=1
поэтому вызывается от каждого пользователя раз в минуту.
Индексы на zooId и life стоят
Я просто не в курсе насколько быстро работает в sql условие
и round((UNIX_TIMESTAMP()-startTime)/60) вычисляется аж 4 раза
что тоже не хорошо
но я не пойму как в запросе вынести это в переменную.
Неактивен
Я немного не в курсе структуры Вашей базы. Пользователь и зоопарк — это
одно и то же?
Индекс один на (zooId, life)? Если отдельные — плохо.
Вычисления не так страшны для MySQL (хоть и выглядят по крайней мере как
стегозавры). Но можно, конечно, улучшить процесс, если хранить не время
создания и период жизни, а хранить время создания и время смерти
Неактивен
у одного пользователя может быть много зоопарков
индексы были отдельные
сделал общий но отдельные не убрал
чем это чревато?
а как улучшится процесс если я введу время смерти?
Неактивен
Отдельные индексы Вам не нужны
Вам не прийдется пересчитывать его раз в минуту
Неактивен
Смерть да
но есть же еще сытость ) Этих зверей еще и кормят
Неактивен
Сытость — точно так же. Процесс кормления откладывает голод (ну и смерть )
на какое-то время. Это можно рассчитывать в процессе кормления, а не раз в
минуту
Неактивен
Спасибо огромное
Завтра с утречка пересмотрю логику приложения ))
Неактивен