【问题标题】:Need optimize SQL query需要优化 SQL 查询
【发布时间】:2018-02-08 11:59:53
【问题描述】:

现在我有这个查询

SELECT 
  d.domain,
  r.domain_id,
  r.d_lider, 
  u.email,
  u.f_name,
  u.l_name,
  u.role 
FROM (
    SELECT r.domain_id, 
    count(r.id) AS d_lider 
    FROM bxa_request AS r
    WHERE MONTH(r.created) = MONTH(CURRENT_DATE()) 
    AND YEAR(r.created) = YEAR(CURRENT_DATE())
    GROUP BY r.domain_id
    ORDER BY d_lider
) AS r
LEFT JOIN bxa_user AS u
ON (
    u.domain_id = r.domain_id 
    AND (u.role = 'A' OR u.role = 'E')
)
LEFT JOIN bxa_domain AS d 
ON (r.domain_id = d.id )
WHERE r.d_lider = (
    SELECT count(*) AS max 
    FROM bxa_request AS r  
    WHERE MONTH(r.created) = MONTH(CURRENT_DATE()) 
    AND YEAR(r.created) = YEAR(CURRENT_DATE())
    GROUP BY r.domain_id 
    ORDER BY max DESC LIMIT 1
)
ORDER BY r.d_lider DESC

但是如果我用 EXPLAIN 命令检查这个查询,我会看到哪个查询不是优化的。请帮我优化我的查询http://joxi.ru/DmBEd5puNoVJBr?d=1

我想从我的查询中排除大计数操作,可能是 join 或任何东西

【问题讨论】:

  • 请将SHOW CREATE TABLE bxa_request 的输出添加到您的问题中。对 bxa_userbxa_domain 表也执行相同操作。

标签: mysql sql query-optimization


【解决方案1】:
WHERE MONTH(r.created) = MONTH(CURRENT_DATE()) 
  AND YEAR( r.created) = YEAR( CURRENT_DATE())

-->

WHERE r.created >= CURDATE() - INTERVAL DAYOFMONTH(CURDATE)-1 DAY
  AND r.created <  CURDATE() - INTERVAL DAYOFMONTH(CURDATE)-1 DAY + 1 MONTH

这会给索引一个被使用的机会。

INDEX(created, domain_id) 可能会有所帮助。

派生表中的ORDER BY d_lider 被忽略。

请在ON 中添加显示表格相关性的内容;把剩下的放在WHERE

如果不需要LEFT,请使用INNER;它可以帮助优化。

请避免使用r 作为外部查询和子查询的别名——这会使人难以解析。

在可能的情况下,将子查询转换为JOINs

要进一步讨论,请使用任何有意义的更改更新问题,并请提供SHOW CREATE TABLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2016-02-02
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多