MySQL GROUP BY花了很多时间来获取记录

时间:2014-09-18 06:47:23

标签: php mysql sql database

我想查询数据库以获取每个用户的最后访问时间,这里是查询:

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,但发现了同样的问题。 谢谢,任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

group by子句和distinct要求对表进行全面扫描。

也许没有group by子句的查询在返回第一行时可以更快,你检查了检索整个结果集所需的时间吗?

如果只需要3-6秒,我会刷新统计数据,也许优化器没有为连接做出最佳选择(我认为表的网页浏览量很大)。

答案 1 :(得分:0)

你的索引是什么?

你真的想要一个左联盟,因为那​​似乎无关紧要吗?使用LEFT OUTER JOIN,你似乎会得到一行为user_id为NULL,但在其他列中也有空值。

此外,您使用GROUP BY为每个用户返回一行。但是,未定义返回哪一行,因此它可以是为用户带回的任何页面视图visit_time。

此外,GROUP BY子句中只有一列,而select中的其他非聚合列。使用MySQL中的默认选项,这将起作用,但在大多数SQL版本中都不起作用,并且当MySQL在严格模式下执行组时也不起作用(参见this manual page)。

在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子句隐式完成的,但它确实使它更明确地表示将来读取代码的人所期望的。)

答案 2 :(得分:0)

Select t1.x, t1.y, t1.z from table1 t1 Group by t1.x,t1.y,t1.z.... 

它会给出更好的表现......

Group by字段(x,y,z)应附加select语句以获得更好的性能。

试一试......(按上述查询的结果集进行分组操作)