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的表
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秒。谢谢