【发布时间】:2018-04-30 16:00:07
【问题描述】:
我需要加快 mysql 中需要 45 秒的查询,我需要计算几个月/几年,包括表中没有结果的月份,为此我创建一个临时日期表,然后启动以下查询,如何加快速度?
//CREATE TABLE OF DATES AND INSERT
CREATE TEMPORARY TABLE fechas(fecha date);
INSERT INTO fechas(fecha)
select * from
(select adddate("1970-01-01",t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date between "2017-01-01" and "2018-01-01"
order by selected_date;
//查询
SELECT DATE_FORMAT(f.fecha, "%m-%Y") as data,
ifnull((
SELECT ifnull(COUNT(*),0)
FROM cupons c
WHERE YEAR(c.dataCupo) = YEAR(f.fecha)
AND MONTH(c.dataCupo) = MONTH(f.fecha)
and c.empresa=1
AND c.proveidor!="VINCULADO"
group by YEAR(c.dataCupo), MONTH(c.dataCupo)
ORDER BY c.dataCupo
),0) AS num
FROM fechas f
where f.fecha BETWEEN "2017-01-01" and "2018-01-01"
GROUP BY YEAR(f.fecha),MONTH(f.fecha);
//结果:
数据 |数量
01-2018 | 15
02-2018 | 0
03-2018 | 20
04-2018 | 0
....
【问题讨论】:
-
旁注
select adddate("1970-01-01"....selected_date between "2017-01-01"什么时候不要把1970-01-01改成2017-01-01因为2017-01-01是你的开始日期而不是1970-01-01 -
你为什么不简单地建立一个具有适当索引的静态日历表?
-
提供
EXPLAIN [query]的输出,这样我们就可以看到问题出在哪里了。