Данный запрос делает выборку по числу повторений за последний час:
SELECT item_id, COUNT(*) FROM log
WHERE TIMESTAMPDIFF(MINUTE, access_time, NOW()) <= 60
GROUP BY item_id
ORDER BY COUNT(item_id) DESC
LIMIT 0,10
Но проблема в том, что MariaDB считает число всех повторяющихся значений в 4 млн записей, которые есть в моей базе данных и выполняется более 5-ти секунд. Можно ли ускорить данный запрос?
Для ускорения этого запроса надо сделать индекс, для ускорения поиска по дате:
create index log_date on log(access_time, item_id);
И переписать условие поиска на следующее:
access_time >= NOW()-interval 60 minute
Старайтесь всегда, все условия выборки писать так, что бы к колонкам таблицы не применялись никакие функции. Во первых БД приходится вычислять их поочередно для каждой строки и во вторых, использование индексов в этом случае становится невозможным, что приводит к полному сканированию таблицы.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей