-1

このテーブルには、サーバー監視レコードが含まれています。サーバーがpingに失敗すると、サーバーは新しいレコードを挿入します。そのため、1台のサーバーで複数回障害が発生する可能性があります。SERVER3が失敗した回数のレコード数を取得したいと思います。

failure_idこれは、主キーがあるテーブルです。

failure_id  server_id  protocol  added_date           
----------  ---------  --------  ---------------------
         1          1  HTTP      2013-02-04 15:50:42  
         2          3  HTTP      2013-02-04 16:35:20

(*)を使用して行をカウントする

SELECT 
  COUNT(*) AS `total` 
FROM
  `failures` `f` 
WHERE CAST(`f`.`server_id` AS CHAR) = 3;

server_idを使用して行をカウントする

SELECT 
  COUNT(`f`.`server_id`) AS `total` 
FROM
  `failures` `f` 
WHERE CAST(`f`.`server_id` AS CHAR) = 3;

SUMを使用して行をカウントする

SELECT 
  IFNULL(SUM(1), 0) AS `total` 
FROM
  `failures` `f` 
WHERE CAST(`f`.`server_id` AS CHAR) = 3;

上記のクエリはすべて正しい出力を返します。しかし、私のデータベースは将来非常に大きくなるでしょう。パフォーマンスに基づいて、どの方法を使用するのが最適ですか?前もって感謝します...

4

4 に答える 4

0

私は上記のどれも言わないと思います。レコードを挿入しているアプリを制御できる場合。その場合、サーバー用のテーブルがない場合は、テーブルを作成するだけです。current_failure_countそれ以外の場合は、または何かというフィールドを追加して、そのテーブルに貼り付けます。したがって、レコードを挿入するときは、サーバーテーブルも更新して、current_failure_count = current_failure_count + 1そのサーバーに設定します。そうすれば、サーバーテーブル(server_id私が推測するインデックス)の1つのレコードを読み取るだけで、設定が完了します。いいえ、これは正規化ルールのいずれにも準拠していませんが、速度を求めているため、クライアントソフトウェアを制御できる場合は、これが最適な方法です。

クライアントソフトウェアを制御できない場合current_failure_countは、サーバーテーブルの値をインクリメントする障害テーブルへのレコードの挿入にトリガーを設定できます。それもうまくいくはずです。

于 2013-02-05T04:17:10.397 に答える
0

まあ、2番目は最初よりも間違いなく効率的です。サーバーのビューを作成することをお勧めします。これにより、処理速度が大幅に向上します。

CREATE VIEW server3 AS
SELECT server_id
FROM failures
CAST(`f`.`server_id` AS CHAR) = 3;

次に、テーブルであるかのように、そのビューでカウントを実行するだけです。

于 2013-02-05T03:56:59.363 に答える
0

他の人と同じように、なぜserver_id値をキャストしているのかは私にはわかりません。これにより、他のどの問題よりもパフォーマンスが低下します。

WHERE server_id = (value)検索してインデックスを作成するようにそのキャストを排除できる場合server_id、提案した最初の2つのクエリのいずれかでインデックスのみの取得を実行でき、最適なパフォーマンスが提供されます。

于 2013-02-05T04:09:08.570 に答える
0
SELECT COUNT(*) AS `total`
FROM  failures f
WHERE f.server_id = 3;

count(*)インデックスを適用すると、より高速な結果が得られますが、算術計算よりも常に優れています。

次善の解決策は

SELECT IFNULL(SUM(1), 0) AS `total`
FROM failures `f`
WHERE f.server_id  = 3;

このメソッドは、マイクロストラテジーなどの多くのツールのSQLエンジンで使用されます

答えが役立つことを願っています...:)

于 2013-02-05T04:12:16.833 に答える