Сортировка по COUNT(*)

254
23 июля 2017, 09:58

Данный запрос делает выборку по числу повторений за последний час:

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-ти секунд. Можно ли ускорить данный запрос?

Answer 1

Для ускорения этого запроса надо сделать индекс, для ускорения поиска по дате:

create index log_date on log(access_time, item_id);

И переписать условие поиска на следующее:

access_time >= NOW()-interval 60 minute

Старайтесь всегда, все условия выборки писать так, что бы к колонкам таблицы не применялись никакие функции. Во первых БД приходится вычислять их поочередно для каждой строки и во вторых, использование индексов в этом случае становится невозможным, что приводит к полному сканированию таблицы.

READ ALSO
Динамические псевдонимы полей в mysql

Динамические псевдонимы полей в mysql

Возможно ли в MySQL добавлять динамически псевдонимы полей?

327
Получить массив String[] из Map&lt;String, String&gt;

Получить массив String[] из Map<String, String>

Добрый деньЕсть такой метод

363
KeyboardButton Telegram Api выполняет нажатие на ссылкy

KeyboardButton Telegram Api выполняет нажатие на ссылкy

В чате телеграма при нажате на номер телефона полученный в сообщение всплывает окошко с предложение звонить на номер или нетМожно ли с помощью...

320
Как разрешить конфликт двух JDK?

Как разрешить конфликт двух JDK?

При компиляции у меня все время падает такое предупреждение:

296