从另一个获取最新的独特价值和附加信息

时间:2014-09-26 09:17:07

标签: mysql

我有两张桌子;

  • 网页 - 包含网址和多个网站名称的表格
  • 访问 - 包含访问时间,客户端IP和访问过的网站的网址的表

我需要掌握对任何给定网页的最后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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

尝试在字段上添加索引" url"在两个表格上:

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

这应该会明显改善您的查询效果(here就是为什么)。