繁体   English   中英

缓慢的MySQL查询-如何加快速度?

[英]Slow MySQL Query - how can it be speed up?

对此进行了编辑-我已经尝试过加快速度,但仍然很慢-任何人都可以再提供帮助吗?

SELECT DISTINCT d.`group_ID`,
  CONCAT(u.fname, ' ', u.lname) AS uname,
  u.corp_id,
  c.`corp_name`,
  u.`user_username`,
  u.location,
  (
    SELECT email 
    FROM users 
    WHERE role = 'Level 4' 
      AND location = d.location 
      AND email NOT LIKE '%manager.%' 
    LIMIT 1
  ) AS trainer,
  u.`email`,
  GROUP_CONCAT(
    DISTINCT d.title 
    ORDER BY d.title SEPARATOR ', '
  ) AS docs 
FROM regulatory d 
  LEFT JOIN users u 
    ON u.user_id = d.`group_ID` 
    AND u.`role` = 'Level 6' 
  LEFT JOIN corporations c 
    ON c.`corp_id` = u.`corp_id` 
WHERE d.`spare1` <> 'green.gif' 
  AND u.`officialjobtitle` <> 'none' 
  AND d.`date_updated` < NOW() 
  AND (u.`corp_id` IN (1)) 
GROUP BY d.`group_ID` 
ORDER BY corp_id,
  u.`location`,
  uname ;
  • 您在where子句中取消了从regulatoryusers的左INNER JOIN ,因此对这两个表使用INNER JOIN
  • 如果可能,在公司上使用INNER JOIN (我只是不知道是否可以)
  • 删除DISTINCT。 您已经在执行GROUP BY并且如果正确完成,则区分开将完全多余(因为它不会执行GROUP BY无法完成的任何操作)
  • 我会尝试更换相关子查询的trainer与已分组,以便你不乘行的“派生表”
  • 在MySQL中使用GROUP BY ,请不要依赖“扩展名”。 始终指定产生唯一行所需的所有字段(就像几乎在所有其他符合SQL的rdbms中一样)

确保在连接所涉及的所有字段上都有索引,如果可能的话,还要在where子句中使用索引。

检查说明计划。

建议的修改:

SELECT
      d.`group_ID`
    , CONCAT ( u.fname , ' ' , u.lname ) AS uname
    , u.corp_id
    , c.`corp_name`
    , u.`user_username`
    , u.location
    , MAX(l4.trainer) as trainer
    , u.`email`
    , GROUP_CONCAT(DISTINCT d.title ORDER BY d.title SEPARATOR ', ') AS docs
FROM regulatory d
INNER JOIN users u ON d.`group_ID` = u.user_id
                   AND u.`role` = 'Level 6'
LEFT JOIN corporations c ON u.`corp_id` = c.`corp_id`
LEFT JOIN (
        SELECT location, MAX(email) AS trainer
        FROM users
        WHERE ROLE = 'Level 4'
            AND email NOT LIKE '%manager.%'
        GROUP BY location
        ) l4 ON d.location = l4.location
WHERE d.`spare1` <> 'green.gif'
    AND u.`officialjobtitle` <> 'none'
    AND d.`date_updated` < NOW()
    AND u.`corp_id` IN (1)
GROUP BY
      d.`group_ID`
    , u.fname
    , u.lname
    , u.corp_id
    , c.`corp_name`
    , u.`user_username`
    , u.location
    , u.`email`
ORDER BY
      corp_id
    , u.`location`
    , uname
;

我认为您的查询行几乎没有问题:

...
(
SELECT email 
FROM users 
WHERE role = 'Level 4' 
  AND location = d.location 
  AND email NOT LIKE '%manager.%' 
LIMIT 1
) AS trainer,
...

对于每一行,您都准备单选。 也许您应该将该查询更改为另一个联接。 我还将建议对MySQL使用说明功能: http : //dev.mysql.com/doc/refman/5.1/en/using-explain.html

为您在所有数据库表中的where条件中使用的所有列添加INDEX。 它将加快您的所有查询。

暂无
暂无

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

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