2015-09-14 55 views
1

問題用於運行總查詢的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

回答

0

開始通過使日期的該表中的永久表,而不是一個子查詢。

此構造執行很差,而且通常可以變成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

增加了附錄... –