настройка SQL-запроса для повышения производительности - PullRequest
1 голос
/ 13 сентября 2011

У меня есть этот оператор SQL, который работает, но для его выполнения требуется некоторое время

У меня есть таблица активности, и мне нужно найти последнее действие и связанного пользователя для каждого идентификатора.

SELECT id, date_time, user  
FROM activity_log a 
WHERE a.date_time = (SELECT MAX(a1.date_time)
                FROM activity_log a1
                WHERE a.id = a1.id
                GROUP BY id)
ORDER BY `id` desc limit 0, 100

У меня есть неуникальный индекс в поле date_time и id.

Как мы можем сократить время выполнения этого запроса?

Ответы [ 2 ]

4 голосов
/ 13 сентября 2011

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

Вместо этого верните весь набор данных id и max (date_time) в качестве подзапроса и присоединитесь к нему. Это требует только 1 поездки в таблицу activity_log для поиска каждого максимума (date_time) и значительно улучшит ваше время выполнения.

SELECT a.id, a.date_time, a.user  
FROM activity_log a 
INNER JOIN (
  SELECT id, MAX(date_time) as date_time
                FROM activity_log 
                GROUP BY id) a1
ON a.id = a1.id and a.date_time = a1.date_time
ORDER BY `id` desc limit 0, 100
1 голос
/ 13 сентября 2011

Что произойдет, если вы попробуете это:

SELECT id, date_time, user   
FROM activity_log a  
WHERE EXISTS 
(SELECT 1 FROM (SELECT ID,MAX(a1.date_time) maxdate
                FROM activity_log a1 
                GROUP BY ID) a1 WHERE A1.ID=A.ID AND A1.MAXDATE=a.date_time)
ORDER BY `id` desc limit 0, 100 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...