2017-01-18 3 views
1

MQTTを介してデバイスが通信できるアプリケーションがあります。 2つ(またはそれ以上のデバイス)が対になっている場合、それらはセッションにある(セッションIDを持つ)データベース内のMQTTセッション - パフォーマーを作る方法?

トピックは、例えば次のとおり

{'phase': 'start', 'othervars': 'examplevar'} 
ようなペイロードを持つ

session/<session-id>/<sender-id>/phase 

すべてのセッションは、次の形式でmySQLデータベースにログインします。

| id | session-id | センダ | トピック(例:phase)| ペイロード |エントリタイム| ...

ここで、セッション全体を取得したいときは、session-idでクエリできます。

私はこのようになります達成したいもう一つのビュー:

は| セッションID(別名)| 開始時刻 | 終了時刻 | duration | 成功 |

成功はブール値です。現在のセッションで、ペイロードに 'phase': 'success'があるエントリがある場合はtrueです。それ以外の場合は成功しません。

ここでは、このクエリが非常に遅いという問題があります。毎回私はそれにアクセスしたいが、それが成功した場合は、時間計算と共に各セッションについて計算しなければならない。

この情報を計算して別のテーブルに入れるには、セッションの最後にスクリプトを作成する必要がありますか?私がこのソリューションで持っている問題は、重複したデータがあることです。

これをインデックスで高速化できますか?それとも、私は最初から巨大なデザインミスをしましたか?

ありがとうございます。

答えて

1

インデックス?はい。はい!

session-idが一意の場合は、idを取り除き、PRIMARY KEY(session_id)を使用してください。

successは、失敗または成功の値が0または1のTINYINT NOT NULLです。

「ペイロード」JSONとして来ている場合は、私は今後の参考のために列内の文字列全体を格納示唆、プラスあなたはとインデックス、それらをに検索する必要がある任意の列を引き出します。 MySQLのそれ以降のバージョンには、JSONというデータ型があり便利です。

SELECTsを提供して、さらにアドバイスをしてください。

ああ、私はインデックスがデータベースにとってどれほど重要であると言及しましたか?

+0

セッションIDは複数のセッションの複数の行を含むため、一意ではありません –

関連する問題