处理巨大的mysql查询:Group BY敏感

时间:2012-12-20 22:29:08

标签: php mysql

我必须在我的网站上运行这个Mysql查询来获取大量数据:(3个表,每个表有100,000 +条记录)

SELECT on_resume.*, on_users.subscribed, on_users.user_avatar, on_resume_page.*
FROM on_resume 
LEFT JOIN on_users ON (on_resume.resume_userid = on_users.user_id ) 
LEFT JOIN on_resume_page  ON ( on_resume.resume_userid = on_resume_page.resume_userid)
WHERE on_resume.active= '1' 
GROUP BY on_resume.rid 
ORDER BY on_resume.rid DESC 
LIMIT 0,18

我在Phpmyadmin sql部分执行此操作时,整个mysqld服务将关闭并需要重新启动。

现在我正在测试此查询,但我发现如果我不使用Group byOrder by条件,那么查询就可以了。

SELECT on_resume.*, on_users.subscribed, on_users.user_avatar, on_resume_page.*
FROM on_resume 
LEFT JOIN on_users ON (on_resume.resume_userid = on_users.user_id ) 
LEFT JOIN on_resume_page  ON ( on_resume.resume_userid = on_resume_page.resume_userid)
WHERE on_resume.active= '1' 
LIMIT 0,18
  

显示0到17行(总共18行,查询耗时0.4248秒)

为什么会这样,我该如何解决?...

注意:在任何一种情况下,我都使用group by或者单独按顺序测试SQL查询,即使其中一个仍然查询失败并挂起服务器。

编辑:通过将列on_resume_page.resume_userid编入索引来解决此问题。

1 个答案:

答案 0 :(得分:0)

这就是我被告知的,花了一段时间来搞清楚: 看看芝加哥的@jer评论

请记住,当存在GROUP BY子句时,某些规则适用于对列进行分组。其中一个规则是“单值规则” - SELECT列表中命名的每个列也必须是分组列,除非它是其中一个集合函数的参数。 MySQL通过允许您在SELECT列表中使用未出现在GROUP BY子句中的列或计算来扩展标准SQL。但是,我们被警告不要使用此功能,除非您从GROUP BY子句中省略的列在组中不是唯一的,因为您将得到不可预测的结果。