1

一時データをメモリ テーブルに保持します。最新の 20 個のエントリだけが必要で、データが常にヒープ上にあることを望みます。どうすればこれを達成できますか? メモリテーブルについてできることは何もないと確信していますが、エントリテーブルをどのように処理すればよいですか? 新しい値をプッシュするときはいつでも、autoincrease キーを追加して最も古いキーを削除する必要がありますか?

4

2 に答える 2

1

何をしようとしているのか、もっと詳しく説明していただけますか?降順の SELECT とLIMIT 20. SELECT クエリが高すぎる場合は、memcached などを使用して結果をキャッシュし、新しいデータが挿入されるたびにキャッシュをクリアします。

追加のテーブルが本当に必要な場合は、テーブルから古いデータを削除する方法がいくつかあります。20 番目の最近のデータの ID をフェッチするか (再び降順で、LIMIT 19,1ID が小さいものをすべて削除します (自動インクリメント インデックス、タイムスタンプなどがある場合)、またはSELECT COUNT(*)昇順DELETELIMIT(すべての項目 - 20) これは、数分ごとに実行される cronjob にパックできます。

しかし、キャッシュを使用してテーブル定義を確認することを強くお勧めします。まともなインデックスがあれば問題はないはずです。

于 2009-03-17T00:40:37.720 に答える
0

20 エントリのテーブルに追加して、最も古い要素 (つまり、最小の ID を持つ要素) を削除することは可能です。ただし、これによりテーブルがフラグメント化されることに注意してください。

たまに走ればOKですOPTIMIZE

別の方法として、20 個のエントリを事前に割り当て、どのエントリが最新であるかを示す個別のカウンターを保持する方法があります。次に、挿入/削除の代わりに、カウンターに基づいてアイテム ID を更新し、インクリメント (mod 20 + 1) して再度保存します。

ただし、これらのモデルはどちらも「シングルスレッド」モデルでのみ機能することに注意してください。複数のスレッドがテーブルで実行されている場合、それらが競合する可能性があります。

カウンタがプログラムメモリ内にあり、スレッドによって共有されているが適切に保護されている場合、それはスレッドセーフで効率的です。

于 2009-02-15T20:43:26.847 に答える