用于运行总查询的MySQL查询优化 - 如何减少查询执行时间?

问题描述:

问题用于运行总查询的MySQL查询优化 - 如何减少查询执行时间?

我有一个查询,我粘贴在下面。我面对的问题是如何在大约10秒的当前时间内将延迟调整到最小。

[email protected] csum = 0; 
SELECT Date_format(assigneddate, '%b %d %Y') AS assigneddate, (@csum: = @csum + numactionitems) AS totalactionitems 
FROM(
    SELECT assigneddate, 
    Sum(numactionitems) AS numactionitems FROM(
     SELECT assigneddate, 
     Count(*) AS numactionitems FROM(
      SELECT * 
      FROM(
       SELECT actionitemtitle, 
       actionitemstatement, 
       altownerid, 
       approvalstatement, 
       assigneddate, 
       assignorid, 
       closeddate, 
       closurecriteria, 
       closurestatement, 
       criticality, 
       duedate, 
       ecd, 
       notes, 
       ownerid, 
       Concat(lastname, ', ', firstname) AS owner, 
       cnames2.categoryvalue AS `team`, 
       cnames2.categorynameid AS `teamid`, 
       cnames3.categoryvalue AS `department`, 
       cnames3.categorynameid AS `departmentid`, 
       cnames4.categoryvalue AS `source`, 
       cnames4.categorynameid AS `sourceid`, 
       cnames5.categoryvalue AS `project_phase`, 
       cnames5.categorynameid AS `project_phaseid`, 
       ac1.actionitemid FROM actionitemcategories AS ac1 INNER JOIN actionitems AS a INNER JOIN users AS u INNER JOIN(
        SELECT actionitemid AS a2id, 
        categorynameid AS c2 FROM actionitemcategories WHERE categoryid = 195) AS ac2 INNER JOIN categorynames AS cnames2 ON cnames2.categorynameid = ac2.c2 AND ac1.categoryid = 195 AND a.actionitemid = ac2.a2id AND ac1.actionitemid = a.actionitemid AND a.ownerid = u.userid INNER JOIN(
        SELECT actionitemid AS a3id, 
        categorynameid AS c3 FROM actionitemcategories WHERE categoryid = 200) AS ac3 INNER JOIN categorynames AS cnames3 ON cnames3.categorynameid = ac3.c3 AND ac2.a2id = ac3.a3id INNER JOIN(
        SELECT actionitemid AS a4id, 
        categorynameid AS c4 FROM actionitemcategories WHERE categoryid = 202) AS ac4 INNER JOIN categorynames AS cnames4 ON cnames4.categorynameid = ac4.c4 AND ac3.a3id = ac4.a4id INNER JOIN(
        SELECT actionitemid AS a5id, 
        categorynameid AS c5 FROM actionitemcategories WHERE categoryid = 203) AS ac5 INNER JOIN categorynames AS cnames5 ON cnames5.categorynameid = ac5.c5 AND ac4.a4id = ac5.a5id) s WHERE 1 = 1) f GROUP BY assigneddate UNION ALL(
      SELECT a.date AS assigneddate, 
      0 AS numactionitems FROM(
       SELECT '2015-03-05' + INTERVAL(a.a + (10 * b.a) + (100 * c.a)) day AS date FROM(
        SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a CROSS JOIN(
        SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b CROSS JOIN(
        SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c) a) ORDER BY assigneddate ASC) t GROUP BY assigneddate LIMIT 282) t 
WHERE assigneddate != '0000-00-00' 

查询

此查询的目的的目的是为了获得包含日期值和收集的是落在某个日期的所有记录的运行计数的所有记录。 日期值在下面的sqlfiddle内计算。它的最终目的是显示在一个图形中,将运行总数作为折线图显示。它将向上计数,因此它是一个不断增长的图表。

我显示的图形称为所有记录(带有日期值的动作项目)的集结图。

问题描述

我的问题是,我得到的查询结果中至少10秒。

问题

我怎样才能加快,减少了查询的延迟,所以,我不会搪塞我图的加载?

完整的模式和我上面的查询的部分运行成功

(我有困难得到主查询到所有在sqlfiddle运行,但我可以从我自己的机器上运行它)。

http://sqlfiddle.com/#!9/865ee/11

任何帮助或建议,将极大的赞赏!我的分类接口

类别(第一个表)的

编辑

加样品截图有一个名为类别名称字段,假设4个值中的一个可扩展或删除这是 - 团队,部门,来源,项目阶段。

类别名称(第二个表)具有一个称为的categoryValue字段,它是实际的允许值为每个类别(第一个表)

实施例 - 球队1,小组2,团队3是类别名内categoryvalues和相应的类别球队。

类别

Categories

+0

4个内部联接(对于类别名称)是动态生成的表,其中包含可变数量的类别。所以我正在转换行并使它们成为列。这样做的目的是支持动态“类别”作为列,而不是固定数量的列。真的,我在过滤器中使用它来为动态类别值选择值。 – Vahe

+0

您可以重新设置问题的格式,以便查询不缩进到目前为止? – Barmar

+0

请参阅上文。感谢你能这么快回复! – Vahe

开始通过使日期的该表中的永久表,而不是一个子查询。

此构造执行很差,而且通常可以变成JOINs无子查询:

JOIN (SELECT ...) 
JOIN (SELECT ...) 

这是因为在子查询没有索引,因此需要完全扫描。

为整个查询提供EXPLAIN

附加物

PRIMARY KEY是一个密钥;不要添加具有相同列的另一个密钥。

EAV模式导致您遇到的复杂性和缓慢性。

请勿使用TINYTEXT;它会减慢复杂查询中的tmp表格;使用VARCHAR(255)。请勿使用VARCHAR(255),请使用VARCHAR,并且具有实际限制。

为什么你需要categoriescategorynames

+0

谢谢你的信息。此处显示的查询说明http://sqlfiddle.com/#!9/865ee/14 – Vahe

+0

增加了附录... –