Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 - Fatal编程技术网

Mysql 使用大小写计数的求和列的性能

Mysql 使用大小写计数的求和列的性能,mysql,Mysql,我有一个查询,总结了一个新买家和返回买家的总数 t\u so\u salesorder表如下所示 create_time | code | member_name | financial_status 2019-01-01 190001 Qwerty 3 2019-01-01 190002 Ytrewq 3 2019-01-01 190003 Poiuyt 1 2019-01-0

我有一个查询,总结了一个新买家和返回买家的总数

t\u so\u salesorder表如下所示

create_time |  code  | member_name | financial_status
2019-01-01    190001      Qwerty            3
2019-01-01    190002      Ytrewq            3
2019-01-01    190003      Poiuyt            1
2019-01-01    190004      Zxcvbn            3
YC   |    MC  | NewBuyer | RetBuyer
2019   January    300        400
2019   February   130        500
2019    March     210        110
.
.
.
我的问题是这样的

SELECT
    T1.YC
    , T1.MC
    , SUM(T1.NewBuyer)
    , SUM(T1.RetBuyer)
FROM
(SELECT
    YEAR(A.create_time) AS YC
    , DATE_FORMAT(A.create_time, '%M') AS MC
    , CASE 
        WHEN COUNT(t1.create_time) = 1 THEN 1
        ELSE 0
    END AS NewBuyer
    , CASE
        WHEN COUNT(t1.create_time) > 1 THEN 1
        ELSE 0
    END AS RetBuyer
FROM 
    db_bb_mall_trade1_prod.t_so_salesorder a
JOIN 
    db_bb_mall_trade1_prod.t_so_salesorder t1 ON a.member_name = t1.member_name AND a.create_time >= t1.create_time and t1.financial_status = 3
WHERE YEAR(A.create_time) BETWEEN YEAR(CURDATE() - INTERVAL 1 YEAR) AND YEAR(CURDATE()) AND a.financial_status = 3
GROUP BY a.create_time, a.member_name, a.code) T1
GROUP BY T1.YC, T1.MC
ORDER BY T1.YC ASC, T1.MC ASC;
输出结果如下所示

create_time |  code  | member_name | financial_status
2019-01-01    190001      Qwerty            3
2019-01-01    190002      Ytrewq            3
2019-01-01    190003      Poiuyt            1
2019-01-01    190004      Zxcvbn            3
YC   |    MC  | NewBuyer | RetBuyer
2019   January    300        400
2019   February   130        500
2019    March     210        110
.
.
.
输出与我想要的完全一样,但问题是,我的查询需要太长时间才能生成。只有14排花了大约2分钟。你能为我推荐一个更简单有效的查询吗。多谢各位

编辑:这是
解释
结果

id | select_type |  table  | type |         possible_keys      | key | key_len | ref |    rows    | Extra
1      PRIMARY    <derived2>  ALL               null             null   null     null  11720877169  Using temporary; Using filesort
2      DERIVED        t1      ALL  IDX_SALESORDERSUM_CREATETIME  null   null     null     108263    Using where; Using temporary; Using filesort
2      DERIVED        a       ALL  IDX_SALESORDERSUM_CREATETIME  null   null     null     108263    Range checked for each record (index map: 0x10)
id |选择|类型|类型|可能的|键|键|列|参考|行|额外
1主所有空11720877169使用临时;使用文件排序
2使用where导出t1 ALL IDX_SALESORDERSUM_CREATETIME null 108263;使用临时设备;使用文件排序
2派生了一个针对每个记录检查的所有IDX_SALESORDERSUM_CREATETIME null 108263范围(索引映射:0x10)

看看那个
11720877169
。它可能是
108263*108263
。闻起来像是“交叉连接”,好像在
子句上没有
,或者它涉及未索引的列。将此添加到t_so_销售订单

ADD INDEX(member_name)
这将使查询的运行速度加快几个数量级

但是,你仍然可以做得更好。我们换衣服吧

            FROM  db_bb_mall_trade1_prod.t_so_salesorder a
            JOIN  db_bb_mall_trade1_prod.t_so_salesorder t1
                          ON a.member_name = t1.member_name
              AND  a.create_time >= t1.create_time
              and  t1.financial_status = 3
            WHERE  YEAR(A.create_time) BETWEEN YEAR(CURDATE() - INTERVAL 1 YEAR)
                                           AND YEAR(CURDATE())
              AND  a.financial_status = 3

来自db_bb_mall_trade1_prod.t_so_销售订单a
加入db_bb_mall_trade1_prod.t_so_销售订单t1
在a.member\u name=t1.member\u name上
a.财务状况=t1.财务状况
和a.create_time>=t1.create_time
其中A.create_time>=CONCAT(年(CURDATE()),“-01-01”)

你可以在查询的开头键入
EXPLAIN
,然后运行它来粘贴
EXPLAIN
结果。@tcadidot0我已经添加了
EXPLAIN
,你能看看110亿行吗!?那是哪张桌子?哦,我的坏。。你能再做一件事吗?运行此查询
SHOW CREATE TABLE t_so_salesorder
,并用结果更新您的问题。谢谢