Производительность SQL - PullRequest
       2

Производительность SQL

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

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

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

SELECT p.`id`, activity, appphone, appname, dateadd 
FROM people p
LEFT JOIN a_log a
ON p.id = a.id 
WHERE (  dateadd >= '2011/09/13 00:00' and dateadd <= '2011/09/13 23:59') 
AND (a.date_time = (SELECT MAX(a1.date_time)
       FROM activity_log a1
       WHERE a.id = a1.id
       GROUP BY id) OR date_time IS NULL)
    ORDER BY `id` desc limit 0, 100

У меня есть неуникальный индекс для поля date_time и id в таблице a_log У меня есть первичный индекс в поле id и неуникальный индекс в поле dateadd в таблице people

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

Ответы [ 5 ]

3 голосов
/ 14 сентября 2011

Это должно работать для вас:

SELECT p.`id`, p.activity, p.appphone, p.appname, p.dateadd, a.*
FROM people p
LEFT OUTER JOIN
(
    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
) a ON p.id = a.id 
WHERE (  dateadd >= '2011/09/13 00:00' and dateadd <= '2011/09/13 23:59'   and `agent_or_underwriter` != 'agent') 
ORDER BY p.id desc limit 0, 100
2 голосов
/ 13 сентября 2011

На высоком высоком уровне (не зная схемы ваших таблиц, ваших индикаторов, вашей РСУБД, структуры вашего диска и т. Д ....).

Я бы попытался удалить подзапрос, выполнив 2 запроса (один для получения максимальной даты, а другой для запуска внешнего запроса).

Я бы также (как отметил Марк) посмотрел план выполнения (с использованием mysql Объяснение: http://dev.mysql.com/doc/refman/5.5/en/explain-output.html), который должен поставить вас в нужное положение для начала оптимизации.

Если вы попробуете эти два пункта, вы сможете оказаться в лучшем положении.

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

Помогает ли это?Я не разбираюсь в MySQL, поэтому Belwo просто очень хорошо не может быть совместимым MySQL

SELECT p.id, a.activity, a.appphone, a.appname, a.dateadd  

FROM people p LEFT JOIN a_log a ON p.id = a.id  
              LEFT JOIN ( SELECT MAX(a1.date_time)
                          FROM activity_log a1 
                          WHERE a.id = a1.id 
                            AND a1.dateadd >= '2011/09/13 00:00' 
                            and a1.dateadd <= '2011/09/13 23:59'
                          GROUP BY id
                        ) 
                          amax ON a.id = amax.id AND ( a.date_time = amax.date_time or a1.date_time IS NULL )

WHERE 1 = 1 


ORDER BY 'id' desc limit 0, 100 
0 голосов
/ 13 сентября 2011

Вы можете создать временную таблицу с индексом для выбора в вашем «И».

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

Попробуйте использовать производную таблицу вместо подзапроса. Должны значительно ускорить процесс.

SELECT p.id, activity, appphone, appname, dateadd  
FROM   people p 
       LEFT JOIN a_log a 
       LEFT JOIN (
           SELECT ID, MAX(date_time) MaxDate 
             FROM activity_log
             GROUP BY ID
       ) a1
          ON a.ID = a1.ID
WHERE  a.date_time IS NULL OR a.date_time = ISNULL(a1.MaxDate, a.date_time) --??
ORDER BY id desc limit 0, 100 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...