2012-04-22 14 views
1

オブジェクトの使用頻度を判断するために、次のフィールドを持つテーブルを使用します。テーブルを適切にクリーンアップする方法

id - objectID - timestamp 

オブジェクトが使用されるたびに、それはIDとtime()がに追加されます。これは、オブジェクトが最後の時間で使用されている頻度を決定するために私を許可/分/秒など

1をした後、時間は、行は役に立たない(私は1時間以上をチェックしていない)。しかし、それは主キー(auto_increment ID)を台無しにする可能性があるので、単に行を削除することは賢明ではないと私は理解しています。

「アクティブ」というフィールドを追加しました。オブジェクトの使用頻度を調べる前に、すべてWHERE active=1をループし、1時間以上経過した場合は0に設定します。私はこれが複数のユーザー間で並行性の問題を引き起こすとは思わないが、これは私に未使用のデータがたくさん残る。

新しい使用量データを挿入する前に、active=0のフィールドがあるかどうかを確認し、新しい行を挿入して新しいデータを更新し、アクティブに設定するのではなく、再び1になる。ただし、複数のクライアントが同じ行を更新しないようにするには、表ロックが必要です。

誰でもこれについてもっと詳しく説明できますか?

答えて

2

ローを削除するとプライマリキーが壊れるということは一度も聞いたことがありません。

auto_incrementによって自動的に割り当てられた値idが他のテーブルの値と確実に一致するようにしようとしていますか?これは必ずしも必要ではありません。idカラムにINTEGER PRIMARY KEYを使用し、値を明示的に割り当てることができます。

+0

「明示的に値を割り当てる」とはどういう意味ですか? – natli

+0

@MichaelSladeは正解です(+1票)。 'objectID'を' Primary Key'(オートインクリメントなし)として使うと、重複していないことを確認できます。古い行は影響を与えないため、削除することができます。さらに、すでに存在する場合は、 'INSERT ON DUPLICATE KEY'(http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html)を使用して行のタイムスタンプを更新することができます。 –

+0

@mazzucci私はあなたが誤解していると思う、私は*必要* * objectIDごとに重複するエントリ。結局のところ、オブジェクトは時間/分/秒ごとに複数回使用できます。 – natli

1

1時間より古いすべての行に一致する更新クエリを実行できます。

UPDATE table SET active=0 WHERE timestamp < now() - interval 1 hour 
+0

いい考えです!なぜ私はいつも物事を複雑にするのですか?とにかく、2つのクライアントが同じ行を選択する可能性はありますか?または、そのような単一のクエリに対してテーブルロックが不要ですか? – natli

関連する問題