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