Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在不使用嵌套查询的情况下优化查询,这是真的吗?_Mysql_Sql_Join - Fatal编程技术网

Mysql 在不使用嵌套查询的情况下优化查询,这是真的吗?

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

我有一个查询,它留下了外部连接和一些嵌套查询,我如何重写它优化它,因为该变量的查询时间太糟糕了超过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_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>