The database is MySQL with the MyISAM engine.
Table definition:
CREATE TABLE IF NOT EXISTS matches ( id int(11) NOT NULL AUTO_INCREMENT, game int(11) NOT NULL, user int(11) NOT NULL, opponent int(11) NOT NULL, tournament int(11) NOT NULL, score int(11) NOT NULL, finish tinyint(4) NOT NULL, PRIMARY KEY ( id ), KEY game ( game ), KEY user ( user ), KEY i_gfu ( game , finish , user ) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3149047 ;
I set the index to (game, finish, user) , but for this GROUP BY query it still takes 0.4 - 0.6 seconds to run:
SELECT user AS player , COUNT( id ) AS times FROM matches WHERE finish = 1 AND game = 19 GROUP BY user ORDER BY times DESC
EXPLAIN output:
| id | select_type | table | type | possible_keys | key | key_len | | 1 | SIMPLE | matches | ref | game,i_gfu | i_gfu | 5 | | ref | rows | Extra | | const,const | 155855 | Using where; Using temporary; Using filesort |
Is there any way to do this faster? The table contains about 800 thousand records.
EDIT: I changed COUNT(id) to COUNT(*) , and the time decreased to 0.08-0.12 seconds. I think I tried this before doing the index and forgot to change it again.
The conclusion of the explanation Using the index explains the acceleration:
| rows | Extra | | 168029 | Using where; Using index; Using temporary; Using filesort |
(Side question: is this a drop in the coefficient of 5 normal?)
There are about 2,000 users, so the final sort, even if it uses filesort, does not degrade performance. I tried without ORDER BY , and it still takes almost the same time.