2016-07-19 8 views
1

タイムスタンプで定義されたフロー内のノード、フロー内のノードには、次のSQLテーブルがあります。すべてのフローにボリュームがあります。SQLテーブルを自動的に集計してパーティション化する

| ID | timestamp | source | handover | nexthop | destination | volume | 
|----|-----------|--------|----------|---------|-------------|--------| 
| 01 | 123456788 | src001 | hnd 001 | nxt 002 | dst 001  | 1.23 | 
| 02 | 123456789 | src002 | hnd 001 | nxt 002 | dst 003  | 4.32 | 
| .. | ......... | ...... | ....... | ....... | .......  | .... | 

現時点ではテーブル26万行(データの2ヶ月程度)で構成され、すべてのフローのエントリは、時間ごとにありますので、それが急速に成長します。私は任意なtimeRangeについてのフローのボリュームをまとめ取得するクエリをやっている時点では

(例えば8日)は、このようなノード上のフィルタリングとは:

SELECT source, handover, nexthop, destination, sum (volume) 
WHERE timestamp >= ts_start AND timestamp <= ts_end 
     AND (source = 123 OR source = 345) AND (nexthop = 789) 
GROUP BY source, handover, nexthop, destination 

当社のデータベースは大きく、スピード違反の必要性成長するにつれて私はすでに遅いクエリを実行していますが、テーブルをさまざまなタイムスライス(たとえば6時間、12時間、24時間)に分割したいが、すべてのテーブルが共存するようにしたい。

07:17/16午後10時から07/19/16午前6時までの質問は、タイムスタンプで分割され、07/17/16午後10時から午後7時17分までの標準1時間表で回答されます。 07/17/16 12 PM、次に07/18/16 12 AMから07/18/16 12 PMまで、残りは6時間表から。

集計と分割を自動的に行うだけでなく、クエリの回答にSQLを使用して、アプリケーションのすべてのロジックを実装する必要はありませんか?

ありがとうございます!

答えて

1

短い答えは:いいえ、MySQLにはそのような組み込み機能がありません。 MySQLはテーブル分割をサポートしていますが、MySQLはどのレコードがどのパーティションに入るかを明確に判断できる必要があるため、各パーティションの正確な範囲を指定する必要があります。単一のレコードは単一のパーティションになければなりません。

さまざまな時間ディメンション表を作成しようとすると、達成しようとしていることは、データウェアハウスに関する質問のように思えます。あなたの代わりにInnoDBテーブルのMyISAMテーブルのエンジンを使用して気にしないならば、あなたはmerge table engineを使用して検討すること

もMRG_MyISAMエンジンとして知られているMERGEストレージエンジンは、その同一のMyISAMテーブルの集まりです1つとして使用することができます。 「同一」とは、すべてのテーブルが同一の列およびインデックス情報を有することを意味する。

この方法では、重複するデータ(複数のテーブルで同じレコード)を持つことができます。特定の6時間のデータが必要であることがわかっている場合は、単一の表だけを照会することができます。または、必要に応じてマージテーブル全体をクエリできます。

それ以外の場合は、完全に独自のソリューションをコーディングする必要があります。

関連する問題