2014-09-26 2 views
0

У меня есть две таблицы;Получение последнего уникального значения и дополнительной информации от другого

  • Веб-страница - таблица, содержащая URL и название ряда сайтов
  • Access - таблица, содержащее время доступа, клиент IP-адреса и URL из какого сайта доступа

Мне нужно, чтобы получить удерживать последний X (допустим, 10) обращается к любой заданной веб-странице, что является уникальной комбинацией ip и url. Поэтому, если пользователь несколько раз подключается к одной странице, это следует указывать только как одну (пусть сказать, последнюю) строку.

У меня есть запрос, который дает мне результат, который мне нужен, но он ЧРЕЗВЫЧАЙНО медленно. Для того, чтобы получить 10 последних уникальных обращений, требуется около 45 секунд.

Это запрос;

select ma.access_date, mp.name 
from access ma, webpages mp 
where ma.url = mp.url 
and ma.id = (select max(id) 
      from access ma2 
      where ma2.client_id = ma.client_id 
      and ma2.url = ma.url) 
order by ma.id desc 
limit 10; 

Как я могу это оптимизировать? Есть ли какой-то недостаток в моем запросе, или я полностью ошибаюсь?

ответ

2

Перемещая (коррелировать) подзапрос, вы можете уменьшить данные, которые будут значительно гласил:

SELECT 
    a.access_date, 
    w.name 
FROM 
    (SELECT 
     client_id, 
     url, 
     MAX(id) id 
    FROM 
     access 
    GROUP BY 
     client_id, url 
    ORDER BY id DESC 
    LIMIT 10 
    ) s 
JOIN 
    access a 
    USING (client_id, url, id) 
JOIN 
    webpages w 
    USING (url) 
+0

С некоторыми незначительными редактирования это прекрасно работает и в настоящее время работает в 0,25 секунды. Благодарю. – Sander

0

Попробуйте добавить индекс на поле «URL» на обеих таблицах:

CREATE INDEX url_access ON access (url); 
CREATE INDEX url_webpages ON webpages (url); 

Это должно решительно улучшить производительность вашего запроса (here почему).

Смежные вопросы