1

現在、提案されているテーブル構造は次のとおりです。

data_table
->impressions
->clicks
->ctr

また

data_table_1
->ctr

data_table_2
->impressions
->clicks

どのようなクエリが実行されますか? インプレッションは毎秒約 500 回更新されます。クリック数は毎秒約 1 回更新されます。ctr には毎秒約 500 の更新があります。

これで、アプリケーションは ctr を使用してデータを並べ替えます。ctr は によって算出されるクリック率ctr = clicks/impressionsです。クリックの更新がない限り、記事のすべてのインプレッションが増加し、同じ関係で ctr が減少しているため、ctr を更新する必要がないことに気付きました。クリックがない限り、ctr を更新する必要はありません。更新します。

現在、更新クエリは「UPDATE data_table SET インプレッション = インプレッション + 1、ctr = クリック / インプレッション WHERE 何か = 何か」のようなものです。

これは、一度に 2 つのフィールドが更新されても、実行されるクエリは 1 つだけであることを意味します。

現在のボトルネックは、これらの 500 の更新により、このテーブルの選択が遅くなることです。1 秒あたり約 20 の選択があります。そこで、テーブルを分けることにしました。新しいテーブル スタイルでは、更新は別のテーブルで行われ、選択は別のテーブルで行われることが提案されています。インプレッションを含むデータ テーブルは非常に頻繁に更新されるため、インプレッションの更新を実行すると、このテーブルのパフォーマンスが大幅に向上します。これは、data_table_2 の選択も高速になり、誰かがクリックするたびに ctr を更新できることを意味します。

そのため、新しいテーブル構造を使用する必要があるかどうかを知りたかっただけです。あなたは何を提案していますか?私の提案の長所と短所!

4

2 に答える 2

1

まず第一に、テーブルのインデックスが適切に作成されていると想定しているため、something = something述語はすぐに対応する行になりますよね?

さらに、更新レートが高いためにボトルネックがディスク スループットであると仮定すると、その場で簡単に計算できるため、ctr 値をまったく保存しないのはどうでしょうか。更新によって制限されているように見えるため、1 つのフィールドを更新するだけで、データをディスクに書き込む必要がある場合の影響が約半分になります。CPU がおそらく比較的アイドル状態であるようなシナリオを考えると、すべての結果のクリック/インプレッションを計算することは問題にならないはずです。あなたのアプローチは報われるでしょう(再びディスクが制限要因であると仮定し、CPU使用率を調べることで簡単に見つけることができると仮定します)、テーブルまたは2つの異なるディスク上にある場合、あなたのアプローチはかなりの利益をもたらします。

CPU が制限要因であることが判明した場合は、something = something述語の評価が非常に複雑であることが原因である可能性があります。この場合、これを単純化することが主な関心事であり、テーブルを分割することはありません。

于 2011-09-05T17:08:21.993 に答える
0

これはあなたの質問に対する直接的な回答ではないかもしれませんが、注意することは重要だと思います。

Redis、MemcacheDB、MongDB、CouchDB などの nosql データベースの使用を検討する必要があると思います。リレーショナル DBMS は、この種の使用にはあまり適していません。たとえば、列を更新するたびに ( UPDATE data_table SET impressions = impressions + 1) キャッシュが消去され、DB はディスクにアクセスする必要があります。

Memcache を使用して、一定期間後にそのデータをディスクにバルクすることを検討できると考える人もいます。

たとえば、いくつかのインプレッションを失う余裕がある場合 (memcache はデータを永続化しないことに注意してください)、memcache でインプレッション ++ を実行し、5 分ごとに DB のデータを更新できます。負担が大幅に軽減されます。

お役に立てば幸いです。

編集

CTR を保存することは良い考えです。これは「非正規化」と呼ばれ、頻繁に必要とされる値である場合、アプリケーションで機能する可能性があります。

于 2011-09-05T17:27:27.670 に答える