MySQL запрос замедляется при использовании группировки по и упорядочить в том же запросе - PullRequest
0 голосов
/ 25 ноября 2011

Я новичок в MySQL. Я должен получить наиболее просматриваемое содержимое (за последние 120 часов) из представлений таблицы. Таблица просмотров содержит 200 000 (lakh) записей. Я проиндексировал столбец contentid, но мой запрос занимает до 10 секунд для получения результата.

Структура таблицы представлений выглядит следующим образом:

contentid viewed                ip
155     2011-10-26 00:07:52     216.251.77.226
1150    2011-10-26 00:08:15     65.52.109.72
1134    2011-10-26 00:08:30     178.53.54.221
14      2011-10-26 00:08:49     178.53.54.221
693     2011-10-26 00:08:58     115.184.174.136
433     2011-10-26 00:09:14     66.249.71.138
558     2011-10-26 00:09:26     91.83.214.3
715     2011-10-26 00:16:01     128.171.36.161
226     2011-10-26 00:16:06     110.36.39.102
562     2011-10-26 00:16:51     84.3.173.188
1134    2011-10-26 00:16:53     110.39.67.139
198     2011-10-26 00:16:57     220.227.133.163
155     2011-10-27 05:43:59     64.135.215.142
155     2011-10-27 08:39:46     157.55.39.86
155     2011-10-27 11:23:05     99.55.166.146
155     2011-10-27 15:40:29     174.255.241.202
1150    2011-10-26 00:50:50     119.30.96.83
1150    2011-10-26 01:02:58     66.249.71.138
1150    2011-10-26 08:02:31     95.144.197.55
1132    2011-10-26 00:16:07     119.160.126.99

и мой запрос

SELECT contentid FROM views 
where viewed > DATE_SUB(NOW(), INTERVAL 120 HOUR) 
GROUP BY contentid ORDER BY count(contentid ) desc limit 0, 15

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Я думаю, что хорошими индексами для этого запроса будет либо простой индекс на viewed, либо составной индекс на (contentid, viewed).


Вы также должны изменить COUNT(contentid) на COUNT(*):

SELECT contentid FROM views 
WHERE viewed > DATE_SUB(NOW(), INTERVAL 120 HOUR) 
GROUP BY contentid 
ORDER BY COUNT(*) DESC 
LIMIT 0, 15
0 голосов
/ 25 ноября 2011

У меня есть понимание, и это может быть неправильно, что Now() функция будет вызываться для каждой строки. Почему бы не вызвать эту функцию один раз и сохранить результат и использовать результат в запросе.

Попробуйте добавить индекс в столбец viewed, таким образом mysql, возможно, не должен идти к таблице. Все данные, необходимые для выполнения этого запроса, будут доступны в индексных файлах.

...