SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.03.2010 16:48:22

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Помогите оптимизировать запрос ...

Доброго времени суток.
Помогите оптимизировать следующий запрос
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;

сейчас идет активный тест приложения с использованием данного запроса.
По структуре каждый пользователь вызывает его примерно раз в минуту.

Уже сейчас ждать ответа от сервера приходится довольно долго sad

Неактивен

 

#2 10.03.2010 17:51:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите оптимизировать запрос ...

Судя по структуре запроса, оно обновляет всех живых динозавров всех
пользователей, поэтому было бы логично вызывать его не раз в минуту
для каждого пользователя, а раз в минуту.

Ну или добавить еще WHERE user = :user: и индекс, соответственно, на
(user, zooId, life).

Неактивен

 

#3 10.03.2010 19:42:17

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Re: Помогите оптимизировать запрос ...

Он обновляет не всех а только по конкретному зоопраку
WHERE zooId=1
поэтому вызывается от каждого пользователя раз в минуту.
Индексы на zooId и life стоят
Я просто не в курсе насколько быстро работает в sql условие
и round((UNIX_TIMESTAMP()-startTime)/60) вычисляется аж 4 раза
что тоже не хорошо
но я не пойму как в запросе вынести это в переменную.

Неактивен

 

#4 10.03.2010 20:03:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите оптимизировать запрос ...

Я немного не в курсе структуры Вашей базы. Пользователь и зоопарк — это
одно и то же?  smile

Индекс один на (zooId, life)? Если отдельные — плохо.

Вычисления не так страшны для MySQL (хоть и выглядят по крайней мере как
стегозавры). Но можно, конечно, улучшить процесс, если хранить не время
создания и период жизни, а хранить время создания и время смерти wink

Неактивен

 

#5 10.03.2010 20:38:58

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Re: Помогите оптимизировать запрос ...

у одного пользователя может быть много зоопарков smile
индексы были отдельные
сделал общий но отдельные не убрал
чем это чревато?
а как улучшится процесс если я введу время смерти? wink

Неактивен

 

#6 10.03.2010 21:08:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите оптимизировать запрос ...

Отдельные индексы Вам не нужны smile

Вам не прийдется пересчитывать его раз в минуту wink

Неактивен

 

#7 10.03.2010 21:29:24

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Re: Помогите оптимизировать запрос ...

Смерть да
но есть же еще сытость ) Этих зверей еще и кормят wink

Неактивен

 

#8 10.03.2010 23:33:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Помогите оптимизировать запрос ...

Сытость — точно так же. Процесс кормления откладывает голод (ну и смерть big_smile)
на какое-то время. Это можно рассчитывать в процессе кормления, а не раз в
минуту wink

Неактивен

 

#9 11.03.2010 00:57:32

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Re: Помогите оптимизировать запрос ...

Спасибо огромное
Завтра с утречка пересмотрю логику приложения ))

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson