2011-11-14 10 views
1

私は多かれ少なかれ良い結果のクエリを持っていますが、処理に約45秒かかります。それは間違いなくGUIにデータを表示するには長すぎます。
私のデータテーブルは、〜2,619,395エントリのものがあり、依然として成長しています。mysqlクエリ - 巨大なテーブルのための既存のMAX-MINクエリを最適化する

スキーマ:exportValueは常にexportValueは〜私の場合には10台のステーション

  • 、すべてがある
  • 実際の絶対値を表し
  • をインクリメントさ

    num | station | fetchDate    | exportValue | error 
    1 | PS1  | 2010-10-01 07:05:17 | 300   | 0 
    2 | PS2  | 2010-10-01 07:05:19 | 297   | 0 
    923 | PS1  | 2011-11-13 14:45:47 | 82771  | 0 
    

    説明

    • 15分10の新しいエントリがテーブルに書き込まれます
    • 012いくつかを書い

      1. select 
            YEAR(fetchDate), station, Max(exportValue)-MIN(exportValue) 
        from 
            registros 
        where 
            exportValue > 0 and error = 0 
        group 
            by station, YEAR(fetchDate) 
        order 
            by YEAR(fetchDate), station 
        

        出力::その上

        Year | station | Max-Min 
        2008 | PS1  | 24012 
        2008 | PS2  | 23709 
        2009 | PS1  | 28102 
        2009 | PS2  | 25098 
        

        私の考え

      2. エラーは、適切な作業ステーション

    作業するクエリのためだけの指標であります文の間に ' 2008年1月1日から2008年1月2日までの間にMIN(exportValue)を取り込み、2008年12月30日から2008年12月31日までMAX(exportValue)を取得する - 問題:多くのクエリと

  • MIN(fetchDate)によるオーダーを使用してのみ、結果セットを自分の10個のステーションに限定しています - 問題:処理に長時間かかります。クエリ
  • 追加情報:
    私は、Javaアプリケーションでクエリを使用しています。つまり、必要に応じて結果セットで後処理を行うことができます。 (JPA 2.0)

    ヘルプ/アプローチ/アイデアは大変ありがとうございます。前もって感謝します。

    答えて

    1

    適切なインデックスを追加すると役立ちます。 2複合インデックスが大幅に物事をスピードアップします:

    ALTER TABLE tbl_name ADD INDEX (error, exportValue); 
    ALTER TABLE tbl_name ADD INDEX (station, fetchDate); 
    
    +0

    インデックスを作成していただきありがとうございます。私はそれについていくつかの情報を見つけるためにgoogleを使いました - > http://www.sitepoint.com/optimizing-mysql-application(誰かが興味を持っているなら)。私の質問は5秒後に処理されるようになりました。残念なことに、phpMyAdminのSQLコンソールを使用し、JPA 2.0を使用してJavaからクエリを処理していない場合のみ:/(しかし、それを見ていきます) – RonH

    0

    3000、レコード上で実行されている。このクエリは非常に高速である必要があります。

    提案:あなたはPKは、このテーブルの上にセット

    • を持っているのですか?駅、fetchDate?
    • インデックスを追加します。豊富なインデックスを試してみる必要があります。okelly彼の答えで示唆された
    • インデックスを持つ実験に応じて、複数のステートメントに - 1つのストアドプロシージャでクエリを中断してみてください。この方法では、クライアントからmysqlに送信される複数のクエリ間のネットワークトラフィックの時間を逃しません。
    • あなたは別々のクエリで試したことがありますが、特定の月のデータがない場合に問題があると言います。ビジネスアプリケーションでは通常のケースです。 "マスタークエリ"(ストアドプロシージャまたはアプリケーションコード)で処理する必要があります。
    • 推測fetchDateはレコード挿入時の現在の日付と時刻です。前月のデータを年、月、局、最大(exportValue)、分(exportValue)フィールドの要約テーブルに保存することを検討してください - これは、毎月末に要約テーブルに要約レコードを挿入する必要があることを意味します。テーブルを個別に削除、保持または移動することはあなたの選択です

    テーブルが急速に成長しているので(15分ごとに)、最後の提案を考慮する必要があります。おそらく、詳細な履歴を1か所に保存する必要はありません。データのアーカイブは、保守の一環として実行する必要があるプロセスです。

    +0

    あなたの提案に感謝します。私はエントリーの量に間違った価値を書いています。それは3K以上の千倍です。:/(2008年までのデータは、日の出から日没までの毎日15分ごとに追加されます[太陽光発電所のデータベースコンテンツ])。私は、データベースがクライアントに属していることを忘れていました。だから私は本当に新しいフィールドなどを追加してそれを変更することはできませんが、私は私のローカルダンプのインデックスのものをテストしました。 phpMyAdminのSQLブラウザで書かれたクエリは速く処理されますが、JPA 2.0を使用しているJavaApplicationではありません:( – RonH

    +0

    残念ながら、私は助けませんでした。本当に申し訳ありませんがJPAには慣れていません。あなたが書いたようにあなたのクエリーを実行していないかもしれません。「クエリーがJPAで遅く動作しています」などの質問をもう一度開くべきでしょう。 –