MySQL にライブ チャット用の MEMORY テーブルがあり (これはこれに最適なテーブル タイプではないのでしょうか?)、毎晩行を削除してチャット ログを管理しやすくすると、テーブルにオーバーヘッドが生じます。ただし、MEMORY テーブルに対して OPTIMIZE を実行することはできないため、オーバーヘッド (Data_free
内show table status
) をどのように取り除くのでしょうか?
1 に答える
どうやってオーバーヘッドを取り除くのですか?
MEMORY / HEAPストレージエンジンを使用してテーブルを強制的に変更すると、削除された行から失われた残りのスペースを回復できますが、何も変更しません。例えば
ALTER TABLE my_table ENGINE=MEMORY;
テーブルを書き換えます。ドキュメントからの引用でそれをバックアップします:
削除された行によって使用されていたメモリを解放するには、ALTER TABLE ENGINE=MEMORYを使用してテーブルを強制的に再構築します。
編集
多分これはこれに最適なテーブルタイプではありませんか?
私の意見では、MEMORYテーブルの理想的なアプリケーションのようには思えません。概して、これはレガシーエンジンだと思います。いくつかの思考の糧
まず、MEMORYテーブルはbツリーインデックス(ハッシュインデックスのみ)を使用できない/使用しないため、順序付けまたは範囲指定(つまり、<、>操作)にインデックスを使用できるクエリは、手動/徹底的に並べ替え/フィルタリングに頼ります。
次に、innodb_buffer_poolが十分に大きい場合、InnodbテーブルはRAMに常駐し、並行スレッドでより適切に機能するため、ほとんどのアプリケーションでMEMORYテーブルと同等かそれ以上のパフォーマンスを発揮することがよくあります。
第三に、おそらく最も重要なことは、MySQLがオフになっていると、テーブル内のすべてのデータが失われることです。レプリケーションを使用している場合にも、テーブルの切り捨てが影響します。