繁体   English   中英

需要优化 SQL 查询

[英]Need optimize SQL query

现在我有这个查询

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM