1

だから...私は3つのテーブルを持つデータベースを持っていると仮定します:
テーブルクライアント
テーブルデータ
とテーブルclients_to_data

また、クライアントが Table dataからデータにアクセスできるようにする API があります。すべてのクライアントはテーブル クライアントにレコードを持っ てます( IPアドレスなど) 。ユーザーが私の API にアクセスすると、彼はclient_to_dataテーブルに記録されます。(したがって、クライアントデータのレコードは更新されず、読み取られるだけです。) また、クライアントごとのヒット数を取得できるようにしたいと考えています。とても簡単です。clients_to_dataをクエリするだけです

client_id を持つテーブルを作成し、結果をカウントします。しかし、DB が大きくなると、clients_to_dataテーブルに何万ものレコードができます。そして、ここに私の質問があります: テーブルクライアント
フィールド「ヒット」を追加して、そのユーザーのヒット数を格納し、ユーザーが API を照会するたびにそれをインクリメントする方が良い方法ですか?一般的に悪いことだと聞いたことがあります。しかし、この場合、ヒット数を取得するプロセスが高速化されると思います。 では、この場合、どの方法がより優れていて速いでしょうか? ご協力いただきありがとうございます!
redundancy

4

3 に答える 3

2

いつ速くなる?テーブルへの追加は、レコードを見つけて更新するよりも速く、読み取り、インクリメントして更新するよりもはるかに高速です。

ただし、ヒットを「事前に計算」すると、集計クエリを使用してヒットをカウントするよりも高速になります。

ラウンドアバウトで失うスイングで得られるものは、現在の使用パターンによって異なります。では、ヒットの追加を遅くして、ヒット数を見つける際に大幅な後押しをする準備はできていますか?

于 2012-05-14T21:33:43.807 に答える
2

明らかに、テーブルから単一の整数列を選択する方が、テーブルから行の count() を選択するよりも高速です。

複雑さのトレードオフは少し議論の余地があります。1 つはより複雑な SQL を記述する必要がある方法で、もう 1 つはコード内で 2 つのテーブルを更新/挿入する必要がある方法です。

ヒット数はどのくらいの頻度で照会されますか? クライアントはそれを調べますか、それとも月に一度チェックしますか? ときどき見るだけなら、count(*) を選択するのにかかる時間についてはあまり気にしないでしょう。

クライアントがすべてのリクエストでヒット カウントを調べる場合は、ヒット列の保存を検討します。

于 2012-05-14T21:27:43.710 に答える
1

テーブル構造がすべて明確に定義されたので、作業に取り掛かりましょう。

すべてのクライアントがデータにアクセスした回数、つまり、DB に何かを記録したいとします。

クライアントの「インプレッション」ごとに「client_to_data」テーブルにレコードを挿入します。

気になる点は2点、

1.冗長性
2.カウント取得時の性能

カウントを格納するときのパフォーマンスについてはどうでしょうか。(ステートメントを挿入します)..?

これは、memcache に挿入するデータを書き込み、1 日の終わりに一括挿入を行うという典型的なシナリオです。

さらに重要なことは、DB に挿入する前にデータを正規化することです。選択に関しては、インデックスを作成します。テキストの場合は、sphinx をインストールします。

ありがとう。

于 2012-05-14T21:32:10.210 に答える