我有两张桌子;
我需要掌握对任何给定网页的最后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;
我该如何优化?我的查询中是否存在一些缺陷,或者我完全走错了路线?
答案 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就是为什么)。