You are here: Re: mysql-question « PHP Programming Language « IT news, forums, messages
Re: mysql-question

Posted by Rik on 08/04/06 13:13

Rik wrote:
> Michael Boutros wrote:
>> ojorus wrote:
>>> Hi!
>>> My company make several flash-based games, and I use php to
>>> communicate with mysql to provide highscore-lists.
>>>
>>> My problem is this:
>>> When I save a player's score in the mysql-table, I want to find
>>> which place the player got with his score (today). To get this I
>>> have tried two different solutions, which both works, but are very
>>> ineffective: (The Time-field is a DateTime type, and I have Score
>>> and Time as Indexes)
>>>
>>> 1) SELECT COUNT(*) FROM table WHERE Score>=$score AND
>>> Time>CURDATE(). - or -
>>> 2) SELECT Score FROM table WHERE Score>=$score AND Time>CURDATE().
>>>
>>> ... $place = mysql_num_rows($result)
>>>
>>> Both give the right result, but the problem is that when there are
>>> many players playing at the same time, and the table consists of
>>> several million records, the query is just too heavy for the
>>> mysql-server, and it breakes down.
>>>
>>> So my question is: Are there any better ways of getting a player's
>>> place?
>>>
>>> Ole Johan, Norway
>>
>> If I understand you correctly, you can use:
>>
>> SELECT score FROM table ORDER BY score DESC LIMIT 1
>>
>> I don't understand why you are using Time>CURDATE(), because it isn't
>> needed in this situation.
>
>
> That's not what the op wants.
> To rephrase what I gather from his post:
> He wants the placing of the score compared to other scores on that
> particular day.
>
> "SELECT COUNT(*) FROM table WHERE Score>=$score AND Time>CURDATE()"
> Would be my choice, but seems to slow. Indexes are already created
> according to the OP, so that's no way to go either. Maybe save only
> the day of the score in the YYYYMMDD format, and use Time=CURDATE()+0.
>
> About using COUNT(*):
> "COUNT(*) is optimized to return very quickly if the SELECT retrieves
> from one table, no other columns are retrieved, and there is no WHERE
> clause."
>
> There is a WHERE clause here, hence the optimization is lost. So,
> maybe use COUNT(score). I don't know wether this will be faster, but
> it's worth a shot.


Adding:
Is score an integer? That's how the database will work best. If it isn't an
integer, consider making it one.

BTW: if this isn't a solution, try (alt.)comp.databases.mysql. Those guys
will know a lot more about mysql optimization.

Grtz,
--
Rik Wasmus

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация