mysql の削除操作でディスク領域が解放されないのはなぜですか

InnoDB では、削除操作によって実際にデータが削除されるわけではなく、Mysql では実際には、削除対象のデータにマークが付けられ、削除済みとしてマークされるだけです。ディスクが占有するスペースは減りません。つまり、テーブルスペースは実際には解放されません。

1. MySQL がデータを削除するいくつかの状況とディスク領域を解放するかどうか

1. 削除、切り捨て

Innodb であっても MyISAM であっても、すぐにディスク領域を解放します。
テーブルの切り捨ては、実際にはテーブルを削除してから作成するのと少し似ていますが、テーブル構造ファイルがすでに存在するなど、テーブルの作成プロセスが最適化されています。したがって、速度はドロップテーブルの速度に近い必要があります。

2. 条件付きで削除する

delete from table_name where xxx; 条件付き削除の場合、innodb も MyISAM もディスク領域を解放しません。

3. 無条件で削除する

delete from table_name はテーブル内のすべてのデータを削除します。MyISAM の場合、ディスク領域はすぐに解放されます (特別に処理する必要があり、より合理的です)。InnoDB はディスク領域を解放しません。

2. フラグメントの生成

  • MySQL での挿入と更新の両方でページ分割が発生する可能性があるため、断片化が存在します。

  • 多数の UPDATE では、ファイルの断片化も発生します。Innodb の最小物理ストレージ割り当て単位はページ (ページ) であり、UPDATE によってページ分割 (ページ分割) が発生する場合もあります。ページ分割が頻繁に行われると、ページがまばらになり、削除されます。 . 不規則なパディングのため、最終的なデータは断片化されます。

  • delete ステートメントは、実際にはデータにマークを付けてリンク リストに記録するだけで、空白スペースが形成されます。

  • InnoDB では、いくつかの行を削除します。これらの行は「削除済み」としてマークされるだけで、インデックスから物理的に削除されないため、スペースは実際には解放されず、再利用されません。InnoDB のパージ スレッドは、これらの不要なインデックス キーと行を非同期的にクリーンアップします。

  • 挿入操作を実行するとき、MySQL は空のスペースを使用しようとしますが、特定の空のスペースが適切なサイズのデータ​​で占有されていない場合、完全に占有することはできず、断片化が形成されます。

3. このデザインを考える

1. mysql の削除操作は論理的に削除のマークを付けるだけであり、ディスク上のデータは実際には削除されません。

2. この設計の理由は次のとおりです。 他の多くのレコードをディスクから削除した後、ディスク上で再配置する必要がある場合、大量のパフォーマンスが消費されます。(例: 大きなテーブルにはインデックスがあり、1 行が削除されるとインデックス構造全体が変更され、その後インデックス構造が変更されると必然的にディスク IO が発生します)

3. 削除されたすべてのレコードはガベージ リンク リストを形成し、リンク リストのレコードが占めるスペースは再利用可能スペースと呼ばれます。新しく挿入されたレコードによってこのスペースが上書きされる可能性があります。

4 番目に、データベースの断片化を確認する方法

-- 查看数据库中每个存在碎片的表
select concat('optimize table ',table_schema,'.',table_name,';'),data_free,engine from information_schema.tables where data_free>0 and engine !='MEMORY';
--查看指定表的碎片情况
show table status like 't_user'

--找到碎片化最严重的表
SELECT table_schema, TABLE_NAME, concat(data_free/1024/1024, 'M') as data_free
FROM `information_schema`.tables
WHERE data_free > 3 * 1024 * 1024
    AND ENGINE = 'innodb'
ORDER BY data_free DESC

5. ゴミの掃除方法

  • テーブル tb_test エンジン = innodb を変更します

    これは実際には NULL 操作です。表面上は何も行いませんが、実際にはフラグメントを再編成します。最適化操作を実行するとき、実際に実行されるのは空の ALTER コマンドですが、このコマンドは最適化にも役割を果たします。再構築されます。テーブル全体の未使用の空きスペースを削除します。

  • テーブル xxx を最適化します。

    OPTIMIZE TABLE ステートメントは、テーブルとインデックスの物理ストレージを再編成し、ストレージ領域を削減し、アクセス I/O 効率を向上させることができます。デフラグ機能と似ています。
     
    MySQL はテーブル最適化ステートメントを使用して、テーブルスペースを解放し、テーブルデータとインデックスの物理ページを再編成し、テーブルが占有するスペースを削減し、読み取りおよび書き込みパフォーマンスを最適化します。 構文: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name
     
    [
    , tbl_name] …

参考资料:
https://blog.csdn.net/levae1024/article/details/121791757
https://www.php.cn/mysql-tutorials-493459.html

转载自:https://www.luoxx.top/archives/mysql-free-disk

おすすめ

転載: blog.csdn.net/w_monster/article/details/128846673