2016-08-28 4 views
1

私は、HighChartsチャート機能に戻るためにクエリを実行しているところに、約600万エントリのデータベースがあります。だから、帰国は5州、上記の文と各を言うことができますが、状態のIDがある...ストアドクエリを使用して大規模な(600万)行のMySQLを検索していますか?

foreach($states as $state_id) { //php code 
    SELECT //mysql psuedocode 
    sum(case when mydatabase.Year = '2003' then 1 else 0 end) Year_2003, 
    sum(case when mydatabase.Year = '2004' then 1 else 0 end) Year_2004, 
    sum(case when mydatabase.Year = '2005' then 1 else 0 end) Year_2005, 
    sum(case when mydatabase.Year = '2006' then 1 else 0 end) Year_2006, 
    sum(case when mydatabase.Year = '2007' then 1 else 0 end) Year_2007, 
    sum(case when mydatabase.Year = '$more_years' then 1 else 0 end) Year_$whatever_year, 
    FROM mytable 
    WHERE State='$state_id' 
    AND Sex IN (0,1) 
    AND Age_segment IN (5,4,3,2,1) 
    AND "other_filters IN (etc, etc, etc) 
} //end php code 

しかし、一度に様々な状態のために:私は長年にわたって縦方向に読み取る必要があるので、私はこのようなクエリを実行していますよ置換された。一方、年数は任意の年数にすることができ、性別(男性/女性/その他)および年齢区分およびその他の修飾子はフィルタに基づいて変化し続けます。クエリは長い(少なくとも30〜40秒)部分です。だから私が思ったことは、私が間違ってやっているのでなければ、実際に上記のクエリを結果とともに2番目のテーブルに格納し、最初に "メタクエリ"をチェックして "キャッシュされている"かどうかを確認し、 DBを読まなくても結果が得られます(非常に頻繁に更新されることはありません)。

これは良い方法ですか、表示されない可能性のある問題がありますか?

EDIT:db(duh)ではなくテーブルに変更されました。

テーブルの構造は次のとおりです。

id | Year | Sex | Age_segment | Another_filter | Etc 

何もないより複雑なものと何かに参加していない以上。 id、Year、Sex、Age_segmentには現在キーがあります。

+0

あなたの 'mydatabase'ファクトテーブルが実際にどのように見えるのかわからなくても、明確に答えるのは容易ではありません。あなたの質問を編集して、そのテーブルの定義を表示してください。 –

+0

回転するものは忘れてしまいます。順序付けられた年と数の配列を返すだけで、プレゼンテーションレイヤー内のすべての表示物を処理します。 – Strawberry

+0

@StrawberryあなたはGROUP BYを意味しますか、年数はどういう意味ですか? –

答えて

1

適切なインデックスは、クエリをスピードアップするために必要とされるものです。まず、クエリで「EXPLAIN」を実行し、ここに結果を投稿します。

私は以下のことをお勧めします。この方法はforループを回避し、1つのクエリでデータを返します。各列の行数とカーディナリティを知らないので、私は州と年の複合インデックスを提案します。

SELECT mytable.State,mytable.Year,count(*) 
FROM mytable 
AND Sex IN (0,1) 
AND Age_segment IN (5,4,3,2,1) 
AND "other_filters IN (etc, etc, etc) 
GROUP BY mytable.State,mytable.Year 

上記のクエリは、いくつかの列のカーディナリティをチェックすることによってさらに最適化できます。カーディナリティを得るには、以下を実行してください:

SELECT Age_segment FROM mytable GROUP BY Age_segment; 
1

擬似コード...

SELECT Year 
    , COUNT(*) total 
    FROM my_its_not_a_database_its_a_table 
WHERE State = $state_id 
    AND Sex IN (0,1) 
    AND Age_segment IN (5,4,3,2,1) 
GROUP 
    BY Year; 
+0

これは、私がフロントエンドから5つのクエリ(各状態に対して)を実行していることを意味します。その多くのデータ(これは、AJAXを使用している多くのページの1つのチャートのためのものです)はまだ遅いです。私が誤解していない限り。 –

+0

これは1つのクエリです。いくつかの状態からデータを戻したい場合は、SELECT(およびGROUP BY)に状態列を含め、それをWHERE節から削除します。性別と年齢についても同様です。 – Strawberry

関連する問題