[英]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 ;
regulatory
到users
的左INNER JOIN
,因此对这两个表使用INNER JOIN
INNER JOIN
(我只是不知道是否可以) GROUP BY
并且如果正确完成,则区分开将完全多余(因为它不会执行GROUP BY
无法完成的任何操作) trainer
与已分组,以便你不乘行的“派生表” 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.