0

繰り返し使用しているタイプのクエリのパフォーマンスに苦労しています。どんな助けでも大歓迎です。

次の表があります。

    item week type  flag   value
    1    1    5     0      0.93 
    1    1    12    1      0.58 
    1    1    12    0      0.92 
    1    2    6     0      0.47 
    1    2    5     0      0.71 
    1    2    5     1      0.22
    ...  ...  ...   ...    ...

(完全なテーブルには、約 10,000 の異なるアイテム、200 週間、1,000 の種類があります。フラグは 0 または 1 です。合計で約 20M 行です)

次のクエリを最適化したいと思います。

    select item, week, 
    sum(value) as total_value,
    sum(value * (1-least(flag, 1))) as unflagged_value
    from test_table 
    where type in (5,10,14,22,114,116,121,123,124,2358,2363,2381) 
    group by item, week;

現在、最速で取得できるのは、(タイプ、アイテム、週) およびエンジン = MyIsam のインデックスを使用することでした。(標準のデスクトップで mysql を使用しています)。

何か提案はありますか (指数、再編成など) ?

4

2 に答える 2

4

私の知識によると、クエリはカバーインデックスGROUP BYでのみ完全に最適化できます。

covering indexあなたのテーブルに以下を追加し、で確認してくださいEXPLAIN

ALTER TABLE test_table  ADD KEY ix1 (type, item, week, value, flag);

次のクエリを使用してインデックス チェックを追加した後EXPLAIN:

SELECT type, item, week,
    SUM(value) AS total_value,
    SUM(IF(flag = 1, value, 0)) AS unflagged_value
FROM test_table
WHERE type IN(5,10,14,22,114,116,121,123,124,2358,2363,2381)
GROUP BY type, item, week;

次のようにクエリを変更する必要がある場合があります。

SELECT item, week,
       SUM(total_value) AS total_value,
       SUM(unflagged_value) AS unflagged_value
FROM(
    SELECT type, item, week,
        SUM(value) AS total_value,
        SUM(IF(flag = 1, value, 0)) AS unflagged_value
    FROM test_table
    GROUP BY type, item, week
)a
WHERE type IN(5,10,14,22,114,116,121,123,124,2358,2363,2381)
GROUP BY item, week;

クエリ実行プランを参照してください。SQLFIDDLE デモはこちら

于 2012-08-23T10:14:44.047 に答える
0

テーブルには2つのインデックスだけが必要だと思います

1. An index on type (non clustered)
2. A composite index on (item, week) in the same order (non clustered)
于 2012-08-23T09:25:36.237 に答える