Mysql 使用大小写计数的求和列的性能
我有一个查询,总结了一个新买家和返回买家的总数 t\u so\u salesorder表如下所示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
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
,并用结果更新您的问题。谢谢