База данных MySQL с движком MyISAM.
Определение таблицы:
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 ;
Я установил индекс на (game, finish, user)
, но для этого GROUP BY
запроса по-прежнему требуется 0,4 - 0,6 секунды для выполнения:
SELECT user AS player
, COUNT( id ) AS times
FROM matches
WHERE finish = 1
AND game = 19
GROUP BY user
ORDER BY times DESC
Выход EXPLAIN
:
| 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 |
Есть ли способ сделать это быстрее? Таблица содержит около 800 тыс. Записей.
РЕДАКТИРОВАТЬ: я изменил COUNT(id)
на COUNT(*)
, и время сократилось до 0,08 - 0,12 секунды. Я думаю, что пытался сделать это до создания индекса и забыл изменить его после.
В выводе объяснения Использование индекса объясняет ускорение:
| rows | Extra |
| 168029 | Using where; Using index; Using temporary; Using filesort |
(Дополнительный вопрос: это нормальное падение в 5 раз?)
Насчитывается около 2000 пользователей, поэтому окончательная сортировка, даже если она использует сортировку файлов, не снижает производительность. Я пытался без ORDER BY
, и это все еще занимает почти то же время.