0

ここに私の質問のために作成された無料の例があります:

+5 サーバーのステータスをチェックする php スクリプトを 15 秒ごとに実行します。pingstatusversionおよび を取得しmotdます。データは 2 週間保存する必要があり、この期間が経過すると削除できます。

現時点では、次のように保存します。

Table 1:
server_ID    |    name    |    ip    |    last_update

Table 2:
ID    |     server_ID    |    status    |    ping    |    version    |    motd    |    timestamp

この方法では、何も二重にならず、サーバーの名前を簡単に変更したり、IP を変更したりできると思います。

しかし、古い行を削除するにはどうすればよいですか? スクリプトを実行するたびに (15 秒ごとに) これを行うのは多すぎますか?14*24*60*4 = 80640 rows per server for the two weeks

または、最新のデータと 2 週間の折れ線グラフを表示するためのデータを取得できるようにするには、どのようにデータを保存すればよいですか?

1 時間ごとのデータを含む 3 番目のテーブルかもしれません。


編集:

回答ありがとうございます。これはどうですか:

15 秒の更新で、すべてのデータを表 1 に入れましたが、更新したので、サーバーごとに 1 行しかありません。

次に、このトリガーを毎時間使用し、現在のデータを新しいテーブルにコピーし、そこから 2 週間以上経過したデータをすべて削除しますか?

現在、表 1 の server_ID と表 2 の ID を主キーとして設定していますが、代わりにタイムスタンプを主キーとして設定する正当な理由はありますか?

4

4 に答える 4

1

まず、5 秒ごとに 2 週間に入力されたレコードの数を計算しましょう。

60 / 5 = 12 times in a min
12 * 60 = 720 times in an hour
720 * 24 = 17280 times in a day
17280 * 14 = 241920 times two weeks

241920 * 5 = 1209600 records

毎日大量のデータが入力されています。MySQL データベースを使用していると仮定します。最新のデータを折れ線グラフで表示したいので。イベント トリガーを作成する必要があります。

イベントトリガー

実行する権限がある場合にのみ使用されるイベント トリガー。したがって、最初にイベントトリガーを次のように設定する必要があります。

SET GLOBAL event_scheduler = ON;

これで、イベント トリガーがオンになり、次のイベント トリガーを作成して実行できます。

CREATE EVENT 
    event_name
ON SCHEDULE AT
EVERY 5 MINUTE 
DO
  DELETE 
  FROM
     Database2 
  WHERE
     timestamp < (CURRENT_TIMESTAMP() - (60*60*24*14) )

5 分ごとにスケジュールされ、現在の日時スタンプから 2 週間前のレコードが削除されます。これで問題が解決することを願っています。テーブルには 2 週間のレコードしかないため、古いレコードは 5 分ごとに削除され、挿入は 5 秒ごとに行われます。

編集された質問

編集された質問は、物事を大きく変えました。現在、table2 にデータが継続的に入力されています。15 秒ごとに table1 を更新し、1 時間ごとに新しいテーブルを作成して古いエントリを削除しています。あなたが何を達成したいのか理解できませんでした。しかし、Primary Key についての質問には最後に答えます。

主キーとは

  • PRIMARY KEY 制約は、データベース テーブル内の各レコードを一意に識別します。

  • 主キーには一意の値が含まれている必要があります。

  • 主キー列に NULL 値を含めることはできません。

  • 各テーブルには主キーが必要であり、各テーブルには主キーを 1 つだけ含めることができます。

単一のタイムスタンプエントリが必要な場合は要件に応じてタイムスタンプに変更しますが、単一サーバーの単一エントリが必要な場合はサーバーに変更します。ただし、別の方法をお勧めします。つまり、主キーの ID として別の列を作成し、server_id とタイムスタンプの 2 つの列の組み合わせで一意のキーのインデックスを作成します。

于 2013-11-03T11:36:40.010 に答える
0

SQL ベースのデータベースを使用する必要があることについては言及されていないため、楽しみのために、これをリレーショナル データベース構造に格納することを避けることができます。

1 つのオプションは Hash ですが、おそらくRedisのようなもので Sorted Set を使用することもできます。ソートされたセットを使用すると、要素を非常に迅速に追加、削除、または更新できます (時間は要素数の対数に比例します)。

Sorted Set のすべてのメンバーはスコアに関連付けられており、最小スコアから最大スコアの順にソート セットを並べ替えるために使用されます。メンバーは一意ですが、スコアが繰り返される場合があります。

スコアはエポック時間 (または類似のもの) であり、メンバーは保存しようとしているデータの JSON オブジェクトである可能性があります。

このタイプの操作は非常に高速であるため、すべての JSON オブジェクトを簡単にコールバックして並べ替えることができます。一意性を確保するために、JSON オブジェクトにエポック時間を格納する必要があります。サーバーあたり 80640 行は、Redis が処理できるものに比べて小さいことに注意してください。たす:

ZADD yourset 1383553120 "<JSON OBJECT>"

最初の引数は現在のエポック時間です。現在のエポック時間がわかっているので、古すぎるすべてのレコードを簡単に削除できます。削除する:

ZREMRANGEBYSCORE yourset -inf 1382344314

最後の引数は、今から 2 週間前のエポック時間である必要があります。

JSON と PHP はうまく機能するので、調べてみる価値があるかもしれません。

于 2013-11-04T08:34:47.067 に答える
0

あなたの質問は、行を削除する方法でしたよね? これは削除で可能です...

DELETE FROM テーブル WHERE x = y

于 2013-11-03T10:41:21.953 に答える
0

パーティショニングをサポートするデータベースを使用していると仮定します (例: MySql >= 5.5 with InnoDb)。そのような場合、タイムスタンプ列を 2 番目のテーブルの主キーに追加し (データベース 2 と言うと、テーブル 2 のことですよね?)、毎日のパーティションを作成します。古いデータを削除するには、2 週間以上前のデイリー パーティションを削除するだけです (これは非常に高速な操作です)。

時間単位で 2 週間のグラフを表示する必要がある場合は、現在のセットアップが十分に高速でないかどうかを最初に確認し、遅すぎる場合にのみ、集計データを格納する追加のテーブルを作成することをお勧めします (ワーカーのクエリによって生成される可能性があります)。たとえば、数分ごとにメインテーブル)

于 2013-11-03T10:59:32.673 に答える