Mysql 应用“在日期加入”以累积方式按天选择数据时的性能问题

Mysql 应用“在日期加入”以累积方式按天选择数据时的性能问题,mysql,sql,Mysql,Sql,我写了一个查询来获取报告数据,它是为给定的时间范围获取数据,但是现在在查询中面临性能问题,我已经分析了这个问题,问题是当我们在日期上应用join时,它花费的时间太长,我将我的查询放在下面,需要10秒。如果您有替代方案,可以提供更好的结果,请提供 SELECT dtbl.selected_date AS grouping, if(def.dfID IS NULL, 0, datediff(DATE(dtbl.selected_date), DATE(CONVERT_TZ(def.create

我写了一个查询来获取报告数据,它是为给定的时间范围获取数据,但是现在在查询中面临性能问题,我已经分析了这个问题,问题是当我们在日期上应用join时,它花费的时间太长,我将我的查询放在下面,需要10秒。如果您有替代方案,可以提供更好的结果,请提供

SELECT 
 dtbl.selected_date AS grouping,
 if(def.dfID IS NULL, 0, datediff(DATE(dtbl.selected_date), DATE(CONVERT_TZ(def.createdDate, "+00:00", "-05:00")))) AS defectAge,
if(def.dfID IS NULL, 0, 1) AS DefectCount
1
FROM
(SELECT selected_date
FROM
(SELECT adddate('2020-02-02', t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date
FROM
(SELECT 0 t0
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 t1
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 t2
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 t3
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 t4
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 DATE(selected_date) BETWEEN '2020-02-02' AND '2020-03-02') dtbl
LEFT JOIN
(SELECT d.dfID,
d.createdDate,
d.lastStatusChangeDate,
drs.defaultresolutionstatusID
FROM defect d
LEFT JOIN listDetail ld ON ld.listDetailID=d.dfType
LEFT JOIN listDetail ld1 ON ld1.listDetailID=d.priority
JOIN project p ON p.projectID = d.projectID
LEFT JOIN defaultresolutionstatus drs ON drs.listDetailID=d.dfStatus
AND drs.projectID = d.projectID
WHERE p.clientID = 51
AND d.projectID IN (4179)
        AND d.extentityDataID is null
        AND if('-1'='-1', true, d.affectedRelease in (-1))
AND if("-1"="-1", TRUE, ld.listValue IN (-1))
AND if("-1"="-1", TRUE, ld1.listValue IN (-1)) ) AS def ON DATE(dtbl.selected_date) >= def.createdDate ; 
如果-1=-1,TRUE,-1中的ld1.listValue为def,则不要在没有操作的情况下使查询混乱;在应用程序代码中动态构造WHERE子句。 ON DATEdtbl.selected_date>=def.createdDate-如果数据类型为date,则无需使用date。 转换成如果时区设置正确,您可能不需要动态隐藏。此外,考虑时间戳而不是日期。 MariaDB有一个漂亮的序列表,可以让你生成一个数字序列,从而动态生成日期——比你现在做的要快得多。 是什么。。。从…算起1。。。?也许是打字错误? 什么版本的MySQL?如果它不是很新,那么这个构造执行得非常糟糕:从选择。。。加入选择。即使是较新的版本,根据有限的数据范围检查每个日期的长列表可能是主要的性能问题。 请提供解释选择…,它可能提供更多线索。 你有什么? 如果-1=-1,TRUE,-1中的ld1.listValue为def,则不要在没有操作的情况下使查询混乱;在应用程序代码中动态构造WHERE子句。 ON DATEdtbl.selected_date>=def.createdDate-如果数据类型为date,则无需使用date。 转换成如果时区设置正确,您可能不需要动态隐藏。此外,考虑时间戳而不是日期。 MariaDB有一个漂亮的序列表,可以让你生成一个数字序列,从而动态生成日期——比你现在做的要快得多。 是什么。。。从…算起1。。。?也许是打字错误? 什么版本的MySQL?如果它不是很新,那么这个构造执行得非常糟糕:从选择。。。加入选择。即使是较新的版本,根据有限的数据范围检查每个日期的长列表可能是主要的性能问题。 请提供解释选择…,它可能提供更多线索。 你有什么?
指定您的MySQL版本。。。你真的需要在270年内有10万个日期吗?发布你的计划输出以制作一个日历表。我需要根据用户输入获取,这是广泛的,我不确定用户将提供什么输入,所以我只是从整个270年中选择范围,这是非常有效的,不会花费太多时间,一旦我缩短了时间范围,查询执行的时间就缩短了。你拥有270年的数据,这给我留下了深刻的印象。无论如何,请参阅指定您的MySQL版本。。。你真的需要在270年内有10万个日期吗?发布你的计划输出以制作一个日历表。我需要根据用户输入获取,这是广泛的,我不确定用户将提供什么输入,所以我只是从整个270年中选择范围,这是非常有效的,不会花费太多时间,一旦我缩短了时间范围,查询执行的时间就缩短了。你拥有270年的数据,这给我留下了深刻的印象。不管怎样,看到了吗