我必须在我的网站上运行这个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 by
和Order 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
编入索引来解决此问题。
答案 0 :(得分:0)
这就是我被告知的,花了一段时间来搞清楚: 看看芝加哥的@jer评论
请记住,当存在GROUP BY子句时,某些规则适用于对列进行分组。其中一个规则是“单值规则” - SELECT列表中命名的每个列也必须是分组列,除非它是其中一个集合函数的参数。 MySQL通过允许您在SELECT列表中使用未出现在GROUP BY子句中的列或计算来扩展标准SQL。但是,我们被警告不要使用此功能,除非您从GROUP BY子句中省略的列在组中不是唯一的,因为您将得到不可预测的结果。