【问题标题】:Handling huge mysql query : Group BY sensitive处理庞大的 mysql 查询:Group BY 敏感
【发布时间】: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 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 或 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 语句)并发布你得到的内容

标签: php mysql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多