【发布时间】:2012-12-20 22:29:07
【问题描述】:
我必须在我的网站上运行这个 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 或 Order by 测试了 SQL 查询,即使其中一种仍然查询失败并挂起服务器。
EDIT :通过将列 on_resume_page.resume_userid 编入索引来解决此问题。
【问题讨论】:
-
您应该得到一个错误...您的 select 子句中有一些项目不在您的 group by 中
-
那么我应该如何使用 group by ?或者为什么当我删除 group by 时仍然使用 order by 我无法运行此查询?
-
你的 on_resume.rid 是主键吗?是否已编入索引?
-
您需要向我们展示表和索引定义。诊断慢查询需要完整的表和索引定义,而不仅仅是描述或解释。也许您的表格定义不佳。也许索引没有正确创建。没有看到表和索引定义,我们无法分辨。
-
group by 通常与 count()、avg()、sum() 等聚合函数结合使用...看起来您不需要使用 group by从您的查询的外观...不过,另一点是您正在加入大量数据,然后如果没有正确索引事物,这将需要一段时间...当您删除'order by ',它只抓取与条件匹配的前 18 行......如何运行:EXPLAIN(然后是你的 sql 语句)并发布你得到的内容