Mysql 从另一个获取最后一个唯一值和附加信息

Mysql 从另一个获取最后一个唯一值和附加信息,mysql,Mysql,我有两张桌子 网页-包含多个站点的url和名称的表格 Access-包含访问时间、客户端IP和他们访问的站点的url的表 我需要掌握对任何给定网页的最后X次访问(比如10次),这是ip和url的独特组合。因此,如果用户多次连接到一个页面,则只应将其列为一行(比如最新的一行) 我有一个查询,可以得到我需要的结果,但是它非常慢。为了获得最后10次唯一访问,大约需要45秒 这就是问题所在 select ma.access_date, mp.name from access ma, webpage

我有两张桌子

  • 网页-包含多个站点的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;

我如何优化这个?我的查询中是否存在某些缺陷,或者我完全走错了方向?

尝试在两个表的“url”字段中添加索引:

CREATE INDEX url_access ON access (url);
CREATE INDEX url_webpages ON webpages (url);
这将显著提高查询的性能(这就是原因)。

通过移动(相关)子查询,您可以大大减少要读取的数据:

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.25秒。谢谢