我想查询数据库以获取每个用户的最后访问时间这里是查询:
SELECT
u.user_id,
u.firstname,
u.lastname,
u.email,
pv.visit_time
FROM
users u
LEFT OUTER JOIN pageviews pv
ON u.user_id = pv.user_id
GROUP BY pv.user_id
LIMIT 0, 12
这个查询在实时服务器上执行需要30到40秒,但是如果我删除GROUP BY子句,则需要3到6秒,但记录重复。知道这个查询出了什么问题吗?
我也试过DISTINCT,但发现了同样的问题。谢谢,任何帮助都将不胜感激。
您的索引是什么?
你真的想要左加入吗,因为这似乎无关紧要?使用LEFT OUTER JOIN,看起来您将获得一行user_id为NULL,但在其他列中也有NULL。
此外,您还使用GROUP BY为每个用户返回一行。但是,返回的行没有定义,因此可以是为用户返回的任何页面视图visit_time。
此外,GROUP BY子句中只有一列,而select中有其他非聚合列。使用MySQL中的默认选项,这将起作用,但在大多数SQL中不起作用,并且在MySQL以严格模式执行分组时也不起作用(请参阅本手册页)。
在u.user_id上添加索引,在pv.user_id和pv.visit_time上添加复合索引
SELECT u.user_id,
u.firstname,
u.lastname,
u.email,
MAX(pv.visit_time)
FROM users u
INNER JOIN pageviews pv
ON u.user_id = pv.user_id
GROUP BY u.user_id, u.firstname, u.lastname, u.email
ORDER BY u.user_id
LIMIT 0, 12
(严格地说,ORDER BY子句不是必需的,因为它是由GROUP BY子句隐式完成的,但它确实使它更加明确了将来阅读代码的人的期望)。
group-by子句和distinct需要对表进行完全扫描。
也许没有groupby子句的查询可以更快地返回第一行,你检查过检索整个结果集需要多长时间吗?
如果只需要3-6秒,我会刷新统计数据,也许优化器没有为联接做最好的选择(我认为表的页面浏览量很大)。
Select t1.x, t1.y, t1.z from table1 t1 Group by t1.x,t1.y,t1.z....
它会给更好的表现,伙计。。。
Group by
字段(x,y,z)应该附加select语句以获得更好的性能。。
试试看。。。(按操作分组将在上述查询的结果集中发生)