0

非常にトラフィックの多い LAMP サーバーでは、メモリ テーブルを使用して、いくつかのデータ項目をカウンターとして追跡しています。次のように実装されます。

$query = "INSERT INTO daily_info_mem SET di_num=1 ,di_type=9, di_date = current_date(), di_sid= $sid_int ,di_name='user_counter' ON DUPLICATE KEY UPDATE di_num=di_num+1";

インデックスは一意の di_type と日付を設定するため、この日付のカウンターが存在する場合は di_type がインクリメントされ、この日付とデータ型の行がない場合は値 0 で作成されます。

ページビューごとに、このようなクエリがいくつかあります。これは、複数の mysql 呼び出しを意味します。

これを、いくつかの任意のカウンターを更新し、必要に応じて行を作成するか、存在する場合は値を増やすという考えを維持する 1 つの mysql 呼び出しにできる限り最適化することは可能ですか?

4

1 に答える 1

3

このタイプのクエリを完全に再考することをお勧めします。メモリ内でより適切に処理できる何かのために、プライマリデータベースに多くのヒットがあります。毎回即座に MySQL を更新することは絶対に必要ですか? MySQL から取り出して memcached に入れることができれば、パフォーマンスが大幅に向上し、バックグラウンドで常にスクリプトを実行してデータを照合し、定期的に (たとえば 5 分ごとに) MySQL にプッシュすることができます。何も失わないでください。

絶対に MySQL 内にある必要がある場合は、InnoDB テーブルではなく HEAP テーブルを使用した方がよい場合があります。「重複したキー」は失われますが、ストアドプロシージャ/関数を使用して更新を行うことができます。繰り返しになりますが、スケジュールされたクエリ/時間指定されたスクリプトをいつでも使用して、「INSERT INTO ... SELECT FROM ...」archiveタイプのテーブルを使用できるため、何も失うことはありません。

または、統計を保存するためにまったく別のデータベースを使用します。MongoDB にはupserts と$increments があるため、統計収集に非常に適しています。

于 2009-09-08T10:23:03.833 に答える