24

MySQLのInnoDBテーブルの行を削除した後、そのスペースは再利用されないことを何度か読んだことがあります。そのため、テーブルに多くのINSERTを作成し、定期的にいくつかの行を削除すると、テーブルはますます多くのスペースを使用します行がまったく削除されていないかのようにディスクに表示されます。

最近、削除された行が占めるスペースは再利用されると言われましたが、一部のトランザクションが完了した後でさえ、完全ではありません。私は今混乱しています。

誰かが私にこれを理解してもらえますか? InnoDB テーブルに多くの INSERT を実行する必要があり、X 分ごとに、Y 分以上経過したレコードを削除する必要があります。ここで InnoDB テーブルが増え続けるという問題がありますか、それともパラノイアですか?

4

2 に答える 2

34

パラノイアです:)

DB のサイズが不必要に大きくなることはありませんが、パフォーマンスの問題のためにスペースも解放されません。

おそらく聞いたことがあるのは、レコードを削除すると、その領域がオペレーティング システムに返されないということです。代わりに、DB が後で再利用するための空きスペースとして保持されます。

それの訳は:

  • DB には、データを保存するための HD スペースが必要です。スペースがない場合は、最初に空きスペースを予約します。
  • 新しい行を挿入すると、そのスペースの一部が使用されます。
  • 空き容量がなくなると、新しいブロックが予約されます。
  • 現在、いくつかの行を削除すると、それ以上のブロックが予約されるのを防ぐために、そのスペースは解放されたままになりますが、オペレーティング システムに戻されることはないため、後で新しいブロックを予約する必要なく再び使用できます。

ご覧のとおり、スペース再利用されますが、返されることはありません。それがあなたの質問の重要なポイントです。

于 2009-03-11T12:44:00.077 に答える
2

innodb では、スペースを解放する実用的な方法はありません。

  • テーブルごとのibdataファイルを使用すると、レコードを削除してデータを新しいテーブルにコピーし、古いテーブルを削除して、レコードを回復できます。
  • mysqldump と大量のレシーペを使用して、サーバー全体をクリーンアップします。以下を確認してください:
    http://dev.mysql.com/doc/refman/5.0/en/adding-and-removing.html

巨大なテーブル (私の場合は 250GB 以上) を使用している場合、これらの方法はすべて実用的ではなく、パフォーマンスを向上させるためにレコードを削除し続ける必要があります。

ハードディスクに上記の機能のいずれかを実行するのに十分なスペースがあるかどうかを真剣に考える必要があります (私の場合、これらすべてのアクションに 1 TB では十分ではないと思います)。

Innotab テーブル (および mysql 自体) では、データベースのサイズが深刻な場合、オプションはかなり制限されます。

于 2009-11-14T05:22:07.303 に答える