Mysql 在不使用嵌套查询的情况下优化查询,这是真的吗?
我有一个查询,它留下了外部连接和一些嵌套查询,我如何重写它优化它,因为该变量的查询时间太糟糕了超过100秒:Mysql 在不使用嵌套查询的情况下优化查询,这是真的吗?,mysql,sql,join,Mysql,Sql,Join,我有一个查询,它留下了外部连接和一些嵌套查询,我如何重写它优化它,因为该变量的查询时间太糟糕了超过100秒: SELECT catalog_requests_character_group_for_report.name as nameGroup, catalog_requests_character_group.name as nameFirst, catalog_requests_character.name as nameSecond, catalog
SELECT
catalog_requests_character_group_for_report.name as nameGroup,
catalog_requests_character_group.name as nameFirst,
catalog_requests_character.name as nameSecond,
catalog_requests_character_group.characterGroupCode as characterGroupCode,
catalog_requests_character.characterCode as characterCode,
(SELECT count(subscriberNumber) FROM t_emergency_requests WHERE (subscriberNumber>-1 and capacityFlag=false) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countGas,
(SELECT count(subscriberBalloonNumber) FROM t_emergency_requests WHERE (subscriberBalloonNumber>-1 or capacityFlag=true) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countBalloon,
(SELECT count(subscriberNumber) FROM t_emergency_requests WHERE (subscriberNumber>-1 and capacityFlag=false) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND detectedCode=0 AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countGasUnjustified,
(SELECT count(subscriberBalloonNumber) FROM t_emergency_requests WHERE (subscriberBalloonNumber>-1 or capacityFlag=true) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode AND detectedCode=0 AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countBalloonUnjustified
FROM catalog_requests_character_group_for_report, catalog_requests_character LEFT OUTER JOIN catalog_requests_character_group ON catalog_requests_character.characterGroupCode= catalog_requests_character_group.characterGroupCode
LEFT OUTER JOIN t_emergency_requests ON catalog_requests_character.characterCode= t_emergency_requests.characterCode WHERE catalog_requests_character.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode GROUP BY nameSecond
有没有办法加快速度?我试图删除左连接中的子查询,但是我在某个地方出错了,最后它没有正确地考虑量< /p>
我的重建不起作用:
解释查询1结果:
我很乐意举几个例子来说明如何解决这样的问题,它有多个左连接,并且连接子句中的条件不正确。在原始查询中,对每个记录分别执行子查询。如果使用联接,则必须将所有计算作为记录集提供。仅在t_紧急请求?中,联接操作字符代码也需要此字段?。在第二个查询中,联接在ON子句中没有对其子查询的有效引用。 注意:我只检查了查询的语法正确性,因为缺少表
SELECT b.NAME AS nameGroup,
c.NAME AS nameFirst,
a.NAME AS nameSecond,
c.characterGroupCode AS characterGroupCode,
a.characterCode AS characterCode, Gas.countGas, Ballon.countBalloon, CGas.countGasUnjustified, CBalloon.countBallonUnjustified
FROM catalog_requests_character as a
INNER JOIN catalog_requests_character_group_for_report as b
ON a.characterGroupForReportCode = b.characterGroupForReportCode
LEFT JOIN catalog_requests_character_group as c
ON a.characterGroupCode = c.characterGroupCode
LEFT JOIN t_emergency_requests as d
ON a.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberNumber) as countGas
FROM t_emergency_requests
WHERE (subscriberNumber >- 1 AND capacityFlag = FALSE)
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30'
GROUP BY characterCode) Gas
ON Gas.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberBalloonNumber) as countBalloon
FROM t_emergency_requests
WHERE (subscriberBalloonNumber >- 1 OR capacityFlag = TRUE)
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30'
GROUP BY characterCode) Ballon
ON Ballon.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberNumber) as countGasUnjustified
FROM t_emergency_requests
WHERE (subscriberNumber >- 1 AND capacityFlag = FALSE)
AND detectedCode = 0
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') CGas
ON CGas.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberBalloonNumber) as countBallonUnjustified
FROM t_emergency_requests
WHERE (subscriberBalloonNumber >- 1 OR capacityFlag = TRUE)
AND detectedCode = 0
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') CBalloon
ON CBallon.characterCode = d.characterCode
GROUP BY nameSecond
ORDER BY nameGroup
感谢您的回答,请找到如下解决方案:
查询时间从100多秒缩短到您使用的是mysql还是sql server?如果是sql server,那么您是否可以将您的执行计划放到www.pastetheplan.com上,并提供链接,这将非常有帮助。使用Mysql 5.6首先确定您使用的是哪种RDBMS。那就看
SELECT b.NAME AS nameGroup,
c.NAME AS nameFirst,
a.NAME AS nameSecond,
c.characterGroupCode AS characterGroupCode,
a.characterCode AS characterCode, Gas.countGas, Ballon.countBalloon, CGas.countGasUnjustified, CBalloon.countBallonUnjustified
FROM catalog_requests_character as a
INNER JOIN catalog_requests_character_group_for_report as b
ON a.characterGroupForReportCode = b.characterGroupForReportCode
LEFT JOIN catalog_requests_character_group as c
ON a.characterGroupCode = c.characterGroupCode
LEFT JOIN t_emergency_requests as d
ON a.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberNumber) as countGas
FROM t_emergency_requests
WHERE (subscriberNumber >- 1 AND capacityFlag = FALSE)
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30'
GROUP BY characterCode) Gas
ON Gas.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberBalloonNumber) as countBalloon
FROM t_emergency_requests
WHERE (subscriberBalloonNumber >- 1 OR capacityFlag = TRUE)
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30'
GROUP BY characterCode) Ballon
ON Ballon.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberNumber) as countGasUnjustified
FROM t_emergency_requests
WHERE (subscriberNumber >- 1 AND capacityFlag = FALSE)
AND detectedCode = 0
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') CGas
ON CGas.characterCode = d.characterCode
LEFT JOIN (SELECT characterCode,
count(subscriberBalloonNumber) as countBallonUnjustified
FROM t_emergency_requests
WHERE (subscriberBalloonNumber >- 1 OR capacityFlag = TRUE)
AND detectedCode = 0
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') CBalloon
ON CBallon.characterCode = d.characterCode
GROUP BY nameSecond
ORDER BY nameGroup
<code>
DROP TABLE
IF EXISTS temp_a1;
CREATE TEMPORARY TABLE temp_a1 AS (
SELECT
*, count(t_emergency_requests.subscriberNumber) as countSN
FROM
t_emergency_requests
WHERE
(
subscriberNumber >- 1
AND capacityFlag = FALSE
)
AND startDate >= '2015-11-01'
AND startDate <= '2016-11-30'
GROUP BY
characterCode
);
DROP TABLE
IF EXISTS temp_b1;
CREATE TEMPORARY TABLE temp_b1 AS (
SELECT
t_emergency_requests.characterCode as cCode, catalog_requests_character.*, count(t_emergency_requests.subscriberBalloonNumber) as countSN
FROM
t_emergency_requests
LEFT JOIN catalog_requests_character ON catalog_requests_character.characterCode=t_emergency_requests.characterCode
WHERE
(
subscriberBalloonNumber >- 1
OR capacityFlag = TRUE
)
AND startDate >= '2015-11-01'
AND startDate <= '2016-11-30'
GROUP BY
t_emergency_requests.characterCode, catalog_requests_character.characterGroupForReportCode
);
DROP TABLE
IF EXISTS temp_c1;
CREATE TEMPORARY TABLE temp_c1 AS (
SELECT
*, count(t_emergency_requests.subscriberNumber) as countSN
FROM
t_emergency_requests
WHERE
(
subscriberNumber >- 1
AND capacityFlag = FALSE
)
AND detectedCode = 0
AND startDate >= '2015-11-01'
AND startDate <= '2016-11-30'
GROUP BY
characterCode
);
DROP TABLE
IF EXISTS temp_d1;
CREATE TEMPORARY TABLE temp_d1 AS (
SELECT
t_emergency_requests.characterCode as cCode, catalog_requests_character.characterGroupForReportCode, count(t_emergency_requests.subscriberBalloonNumber) as countSN
FROM
t_emergency_requests
LEFT JOIN catalog_requests_character ON catalog_requests_character.characterCode=t_emergency_requests.characterCode
WHERE
(
subscriberBalloonNumber >- 1
OR capacityFlag = TRUE
)
AND detectedCode = 0
AND startDate >= '2015-11-01'
AND startDate <= '2016-11-30'
GROUP BY
t_emergency_requests.characterCode, catalog_requests_character.characterGroupForReportCode
);
DROP TABLE
IF EXISTS alt_temp_a1;
DROP TABLE
IF EXISTS alt_temp_b1;
DROP TABLE
IF EXISTS alt_temp_c1;
DROP TABLE
IF EXISTS alt_temp_d1;
CREATE TEMPORARY TABLE alt_temp_a1 LIKE temp_a1;
CREATE TEMPORARY TABLE alt_temp_b1 LIKE temp_b1;
CREATE TEMPORARY TABLE alt_temp_c1 LIKE temp_c1;
CREATE TEMPORARY TABLE alt_temp_d1 LIKE temp_d1;
SELECT
catalog_requests_character_group_for_report.name as nameGroup,
catalog_requests_character_group.name as nameFirst,
catalog_requests_character.name as nameSecond,
catalog_requests_character_group.characterGroupCode as characterGroupCode,
catalog_requests_character.characterCode as characterCode,
(SELECT SUM(countSN) FROM temp_a1 WHERE temp_a1.characterCode=catalog_requests_character.characterCode) AS countGas,
(SELECT SUM(countSN) FROM temp_b1 WHERE temp_b1.cCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode=catalog_requests_character_group_for_report.characterGroupForReportCode) AS countBalloon,
(SELECT SUM(countSN) FROM temp_c1 WHERE temp_c1.characterCode=catalog_requests_character.characterCode) AS countGasUnjustified,
(SELECT SUM(countSN) FROM temp_d1 WHERE temp_d1.cCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode=catalog_requests_character_group_for_report.characterGroupForReportCode) AS countBallonUnjustified
FROM catalog_requests_character_group_for_report, catalog_requests_character
LEFT OUTER JOIN catalog_requests_character_group ON catalog_requests_character.characterGroupCode= catalog_requests_character_group.characterGroupCode
LEFT OUTER JOIN t_emergency_requests ON catalog_requests_character.characterCode= t_emergency_requests.characterCode
WHERE catalog_requests_character.characterGroupForReportCode=catalog_requests_character_group_for_report.characterGroupForReportCode
GROUP BY nameSecond
UNION ALL
SELECT
catalog_requests_character_group_for_report.name as nameGroup,
catalog_requests_character_group.name as nameFirst,
catalog_requests_character.name as nameSecond,
catalog_requests_character_group.characterGroupCode as characterGroupCode,
catalog_requests_character.characterCode as characterCode,
(SELECT SUM(countSN) FROM alt_temp_a1 WHERE alt_temp_a1.characterCode=catalog_requests_character.characterCode) AS countGas,
(SELECT SUM(countSN) FROM alt_temp_b1 WHERE alt_temp_b1.cCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode=catalog_requests_character_group_for_report.characterGroupForReportCode) AS countBalloon,
(SELECT SUM(countSN) FROM alt_temp_c1 WHERE alt_temp_c1.characterCode=catalog_requests_character.characterCode) AS countGasUnjustified,
(SELECT SUM(countSN) FROM alt_temp_d1 WHERE alt_temp_d1.cCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode=catalog_requests_character_group_for_report.characterGroupForReportCode) AS countBalloonUnjustified
FROM catalog_requests_character_group_for_report, catalog_requests_character_group
LEFT OUTER JOIN catalog_requests_character ON catalog_requests_character.characterGroupCode= catalog_requests_character_group.characterGroupCode
LEFT OUTER JOIN t_emergency_requests ON catalog_requests_character_group.characterGroupCode= t_emergency_requests.characterGroupCode WHERE catalog_requests_character_group.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode
GROUP BY nameFirst
ORDER BY nameGroup
</code>