一時データをメモリ テーブルに保持します。最新の 20 個のエントリだけが必要で、データが常にヒープ上にあることを望みます。どうすればこれを達成できますか? メモリテーブルについてできることは何もないと確信していますが、エントリテーブルをどのように処理すればよいですか? 新しい値をプッシュするときはいつでも、autoincrease キーを追加して最も古いキーを削除する必要がありますか?
2 に答える
何をしようとしているのか、もっと詳しく説明していただけますか?降順の SELECT とLIMIT 20
. SELECT クエリが高すぎる場合は、memcached などを使用して結果をキャッシュし、新しいデータが挿入されるたびにキャッシュをクリアします。
追加のテーブルが本当に必要な場合は、テーブルから古いデータを削除する方法がいくつかあります。20 番目の最近のデータの ID をフェッチするか (再び降順で、LIMIT 19,1
ID が小さいものをすべて削除します (自動インクリメント インデックス、タイムスタンプなどがある場合)、またはSELECT COUNT(*)
昇順DELETE
でLIMIT
(すべての項目 - 20) これは、数分ごとに実行される cronjob にパックできます。
しかし、キャッシュを使用してテーブル定義を確認することを強くお勧めします。まともなインデックスがあれば問題はないはずです。
20 エントリのテーブルに追加して、最も古い要素 (つまり、最小の ID を持つ要素) を削除することは可能です。ただし、これによりテーブルがフラグメント化されることに注意してください。
たまに走ればOKですOPTIMIZE
。
別の方法として、20 個のエントリを事前に割り当て、どのエントリが最新であるかを示す個別のカウンターを保持する方法があります。次に、挿入/削除の代わりに、カウンターに基づいてアイテム ID を更新し、インクリメント (mod 20 + 1) して再度保存します。
ただし、これらのモデルはどちらも「シングルスレッド」モデルでのみ機能することに注意してください。複数のスレッドがテーブルで実行されている場合、それらが競合する可能性があります。
カウンタがプログラムメモリ内にあり、スレッドによって共有されているが適切に保護されている場合、それはスレッドセーフで効率的です。