-1

ASP.NET を使用して作成された求人情報サイトがあり、DB は MYSQL です。

そこで、ユーザーは国を選択して欠員を配置できます。そして、すべての仕事には独自のカテゴリがあります。私がやりたいのは、各場所と各カテゴリの前にカウンターを表示することです。

私は通常、左結合を使用してクエリから行カウンターを取得することでこれを行います。

パフォーマンスを考えると、それは良い方法ですか?

カウンターを格納するための別のテーブルを維持するとどうなりますか。ユーザーが広告を掲載すると、カウンターは 1 増加し、削除または期限切れの場合はカウンターが 1 減少します。何百万ものユーザーが同時に広告を掲載していることを思い出してください。これはロックにつながる可能性がありますか?

また、MySQL クエリ キャッシュについても聞きました。私はこれについて何の考えも持っていません。

このサイトには、毎日多くのページ ヒットがあります。200万近く。

または、これを行うための最良の方法はありますか?その時点までの DB の正確な記録を伝えたくないことを思い出してください。ユーザーはそれを気にしません。しかし、精度は特定の時間だけ存在する必要があります。

4

2 に答える 2

1

誰かが国やカテゴリを目にするたびにleft join+クエリを発行するのは、良い考えとは思えません。group byこれにより、パフォーマンスが低下する可能性が非常に高くなります。

MySQL クエリ キャッシュは少し役立つかもしれませんが、私はそれに頼りません。

カウンターを個別に保存すると、データが非正規化され、カウンターが実際のデータと同期しなくなる可能性があります (たとえば、求人情報を手動で変更したり、カウンターを更新しないコードを使用した場合)。

カウンターが常に正確であることはどれほど重要ですか? それほど重要ではないに違いない。したがって、アプリケーション レベルのキャッシュ ( ASP.NET Application Stateなどに格納) を実装し、国ごとおよびカテゴリごとにカウンターを格納します。最後に更新されてから N 分経過していない限り、キャッシュからデータを取得するクラスでキャッシュをラップします。それ以外の場合は、最初にデータベース クエリを発行して現在のデータでキャッシュを更新します (このロジックを で囲むlock()か、選択した別のスレッド セーフ メカニズムを使用することを忘れないでください)。

于 2015-09-11T08:35:02.320 に答える
0

1 日あたり 200 万件のクエリがあるので、まだ問題にはなっていないかもしれませんが、近づいています。

クエリ キャッシュは実行可能なソリューションではありません。テーブルへのすべての書き込みは、そのテーブルの QC のすべてのエントリを無効にします。読み取り数が書き込み数より大幅に多くない限り、QC は無駄です。

正確な数は重要ではないとおっしゃいましたか。それから私は提案します:

  • カウントの別のテーブルを用意します。
  • すべてを詳しく説明するバックグラウンド ジョブを用意しますが、ロックを長時間保持しないように注意してください。レプリケーションがある場合は、スレーブから読み取り、マスターに書き込むことを検討してください。
  • テーブルにはカテゴリとカウントのみが含まれるため、サイズが小さくなり、キャッシュ可能になります (QC ではなく、エンジンの通常のキャッシュ内)。

メイン テーブルからカウントを引き出すことで、メイン テーブルへの影響を軽減します。

さらにサポートが必要な場合は、すべてのカウントを生成する と を提供SHOW CREATE TABLEしてください。SELECT ... GROUP BY ...これにより、作業内容の詳細が得られるはずですが、そのクエリは直接実行できない場合があります.

于 2015-09-13T04:53:53.670 に答える