1

問題

以下に貼り付けたクエリがあります。私が直面している問題は、レイテンシーを現在の約 10 秒よりも短くするにはどうすればよいかということです。

set@ 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

どんな助けや提案も大歓迎です!

編集

私のカテゴリーインターフェースのサンプルスクリーンショットを追加しました

カテゴリ (最初のテーブル) には、カテゴリ名というフィールドがあり、Team、Department、Source、Project_Phase の 4 つの値のいずれかを展開または削除できると想定しています。

CategoryName (2 番目のテーブル) には、各カテゴリ (最初のテーブル) の実際の許容値である categoryvalue というフィールドがあります。

例 - チーム 1、チーム 2、チーム 3 は、カテゴリ名内のカテゴリ値であり、チームのカテゴリに対応します。

カテゴリー

カテゴリー

4

1 に答える 1

0

その日付のテーブルを、サブクエリではなく永続的なテーブルにすることから始めます。

このコンストラクトはパフォーマンスが非常に悪く、通常はJOINsサブクエリなしで変換できます。

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

これは、サブクエリにインデックスがないため、フル スキャンが必要になるためです。

EXPLAINクエリ全体を提供します。

補遺

APRIMARY KEYはキーです。同じ列を持つ別のキーを追加しないでください。

EAV スキーマは、遭遇している複雑さと動きの鈍さにつながります。

使用しないでくださいTINYTEXT。複雑なクエリで tmp テーブルの速度が低下します。使用してVARCHAR(255)ください。を使用しないでください。現実的な制限VARCHAR(255)で使用してください。VARCHAR

なぜ と の両方が必要なのcategoriesですcategorynamesか?

于 2015-09-14T03:23:35.723 に答える