關(guān)于MySQL將表中數(shù)據(jù)刪除后多久空間會(huì)被釋放出來(lái)
MySQL 刪除數(shù)據(jù)后,空間不會(huì)立即釋放給操作系統(tǒng),而是會(huì)被標(biāo)記為“可重用”,以供未來(lái)插入新數(shù)據(jù)時(shí)使用。只有滿足特定條件時(shí),空間才可能真正返還給操作系統(tǒng)。這主要取決于你使用的 存儲(chǔ)引擎(InnoDB 或 MyISAM)。
一、MySQL數(shù)據(jù)刪除與空間管理
1.1 理解MySQL數(shù)據(jù)刪除原理
假如硬盤是一塊巨大的土地。
- 刪除數(shù)據(jù):就像你拆掉了土地上的一棟房子。土地本身(硬盤空間)還在,只是房子(數(shù)據(jù))沒(méi)了,這塊地被標(biāo)記為“空地”,可以用來(lái)蓋新房子。
- 空間釋放給操作系統(tǒng):就像你把這塊“空地”還給了政府(操作系統(tǒng)),其他程序也可以使用這塊地。MySQL 默認(rèn)傾向于自己留著“空地”,而不是還給“政府”,因?yàn)樽约毫糁闷饋?lái)更快。
1.3 執(zhí)行SQL
-- 刪除數(shù)據(jù)(空間不會(huì)立即釋放) DELETE FROM your_table WHERE condition; -- 需要手動(dòng)執(zhí)行以下命令來(lái)釋放空間: -- 方式1:優(yōu)化表(會(huì)鎖表,生產(chǎn)環(huán)境謹(jǐn)慎使用) OPTIMIZE TABLE your_table; -- 方式2:重建表 ALTER TABLE your_table ENGINE=InnoDB; -- 方式3:清空整個(gè)表(立即釋放) TRUNCATE TABLE your_table;
1.3 使用總結(jié)
| 場(chǎng)景 | 存儲(chǔ)引擎 | 刪除數(shù)據(jù)后的空間狀態(tài) | 如何釋放空間給OS |
|---|---|---|---|
| 刪除部分行 | InnoDB | 空間被標(biāo)記為可重用,物理文件大小不變。 | 運(yùn)行 OPTIMIZE TABLE。 |
| 刪除部分行 | MyISAM | 空間被標(biāo)記為可重用,物理文件大小不變。 | 運(yùn)行 OPTIMIZE TABLE。 |
| 清空表 | InnoDB | 空間被標(biāo)記為可重用,物理文件大小不變。 | 運(yùn)行 OPTIMIZE TABLE。 |
| 清空表 | MyISAM | 立即釋放所有空間給操作系統(tǒng)。 | 使用 TRUNCATE TABLE。 |
| 刪除整個(gè)表 | InnoDB / MyISAM | 立即釋放所有空間給操作系統(tǒng)。 | 使用 DROP TABLE。 |
1.4 使用建議
- 日常監(jiān)控:不要只看文件大小,要用 SQL 查詢表的“數(shù)據(jù)空間”和“索引空間”。
這里的
SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Table Size (MB)', ROUND((data_free / 1024 / 1024), 2) AS 'Free Space (MB)' FROM information_schema.TABLES WHERE table_schema = 'your_database_name';data_free大致顯示了表的碎片(即可重用空間)。 - 定期維護(hù):對(duì)于有大量
DELETE/UPDATE操作的表,需要定期(例如在業(yè)務(wù)低峰期)執(zhí)行OPTIMIZE TABLE來(lái)回收空間。 - 謹(jǐn)慎操作:在生產(chǎn)環(huán)境中執(zhí)行
OPTIMIZE TABLE前,一定要評(píng)估好它對(duì)性能的影響和所需的時(shí)間。 - 考慮分區(qū):對(duì)于非常大的表,可以考慮使用分區(qū)。例如,按時(shí)間分區(qū),你可以直接
DROP掉舊的分區(qū),這是一個(gè)非??焖偾夷芩查g釋放大量空間的操作,遠(yuǎn)快于DELETE和OPTIMIZE。
查詢數(shù)據(jù)庫(kù)的用量,可以使用下面的SQL:
-- 查看表空間信息
SELECT
TABLE_NAME,
ROUND(DATA_LENGTH/1024/1024, 2) AS '數(shù)據(jù)大小(MB)',
ROUND(INDEX_LENGTH/1024/1024, 2) AS '索引大小(MB)',
ROUND(DATA_FREE/1024/1024, 2) AS ' 碎片空間(MB)',
ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024, 2) AS ' 總大小(MB)'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) desc;二、InnoDB 存儲(chǔ)引擎(最常用)
一句話總結(jié):不會(huì)立即釋放空間給操作系統(tǒng),刪除的數(shù)據(jù)空間會(huì)被標(biāo)記為“可復(fù)用”,用于后續(xù)的INSERT操作。只有執(zhí)行 OPTIMIZE TABLE 或 ALTER TABLE 時(shí)才會(huì)真正釋放空間給OS。
InnoDB 的空間管理機(jī)制更為復(fù)雜和智能。
2.1 空間標(biāo)記為可重用(不會(huì)釋放給OS)
當(dāng)你執(zhí)行 DELETE 語(yǔ)句時(shí),InnoDB 會(huì):
- 標(biāo)記記錄為刪除:被刪除的行及其關(guān)聯(lián)的索引條目會(huì)被標(biāo)記為“可刪除”,但不會(huì)立即從物理文件中移除。這個(gè)過(guò)程被稱為**“purge”**,由后臺(tái)的 purg 線程異步清理。
- 空間變?yōu)榭芍赜?/strong>:清理后,這些頁(yè)(Page,InnoDB 存儲(chǔ)的基本單位)中的空間就變成了“可重用”空間。這些空間仍然在 InnoDB 的數(shù)據(jù)文件(通常是
ibdata1或.ibd文件)中,但可以被新的INSERT或UPDATE操作利用。
例子:
你有一個(gè) 1GB 的表,刪除了 500MB 的數(shù)據(jù)。
- 現(xiàn)象:
ibd文件大小仍然是 1GB。 - 事實(shí):表內(nèi)部有大約 500MB 的“空閑空間”,可以插入新數(shù)據(jù)而不需要讓物理文件變大。
為什么這么做?
- 性能:頻繁地向操作系統(tǒng)申請(qǐng)和釋放空間(文件大小變化)是非常慢的 I/O 操作。內(nèi)部重用空間要快得多。
- 碎片整理:保留空間有助于減少磁盤碎片。
2.2 什么情況下空間會(huì)釋放給操作系統(tǒng)?
InnoDB 只有在特定條件下,才會(huì)“收縮”數(shù)據(jù)文件,把空間還給操作系統(tǒng)。
1. OPTIMIZE TABLE 命令
這是最直接、最常用的方法。它會(huì):
- 創(chuàng)建一個(gè)新的、臨時(shí)性的
.ibd文件。 - 將原表中未被刪除的數(shù)據(jù)復(fù)制到新文件中。
- 用這個(gè)新的、緊湊的文件替換掉舊的、臃腫的文件。
- 在這個(gè)過(guò)程中,所有被刪除數(shù)據(jù)占用的空間都被釋放了。
OPTIMIZE TABLE your_table_name;
注意:
OPTIMIZE TABLE在執(zhí)行期間可能會(huì)鎖表(對(duì)于在線 DDL 支持的版本,會(huì)盡量減少鎖時(shí)間),可能會(huì)影響線上業(yè)務(wù)。- 它需要額外的磁盤空間,至少等于表的大小,因?yàn)橐獎(jiǎng)?chuàng)建一個(gè)臨時(shí)副本。
- 這是一個(gè)耗時(shí)的操作,特別是對(duì)于大表。
2. 刪除整個(gè)表
這個(gè)很簡(jiǎn)單直接:
DROP TABLE your_table_name;
這會(huì)立即刪除表的定義和它的 .ibd 文件,所有空間都會(huì)被操作系統(tǒng)回收。
3. 表空間文件自動(dòng)收縮(不常見)
對(duì)于使用獨(dú)立表空間(innodb_file_per_table=ON,這是 MySQL 5.6+ 的默認(rèn)設(shè)置)的表,InnoDB 在某些情況下可能會(huì)自動(dòng)收縮文件,但這不可靠且不應(yīng)依賴。OPTIMIZE TABLE 才是主動(dòng)收縮的可靠方式。
二、MyISAM 存儲(chǔ)引擎(較少用)
一句話總結(jié):刪除操作后會(huì)立即釋放空間給操作系統(tǒng),但需要表級(jí)鎖,影響并發(fā)性能
MyISAM 的機(jī)制相對(duì)簡(jiǎn)單粗暴。
- 刪除行:MyISAM 也會(huì)標(biāo)記刪除,空間變?yōu)榭芍赜谩?/li>
- 釋放空間:與 InnoDB 不同,MyISAM 有一個(gè)專門的命令
OPTIMIZE TABLE或myisamchk工具來(lái)整理碎片并釋放空間。 - 刪除所有行:如果你使用
TRUNCATE TABLE命令清空 MyISAM 表,它會(huì)立即釋放所有空間給操作系統(tǒng)。而 InnoDB 的TRUNCATE TABLE只是重置表,空間仍然保留在表空間內(nèi)。
總而言之,在 MySQL(尤其是 InnoDB)中,刪除數(shù)據(jù)≠釋放空間給操作系統(tǒng)。你需要通過(guò) OPTIMIZE TABLE 這樣的維護(hù)操作來(lái)真正“瘦身”你的數(shù)據(jù)庫(kù)文件。
到此這篇關(guān)于MySQL中將表中數(shù)據(jù)進(jìn)行刪除后多久空間會(huì)被釋放出來(lái)的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)刪除釋放空間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 為什么MySQL 刪除表數(shù)據(jù) 磁盤空間還一直被占用
- MySQL數(shù)據(jù)表字段操作指南之添加、修改與刪除方法
- MySQL刪除表數(shù)據(jù)、清空表命令詳解(truncate、drop、delete區(qū)別)
- Mysql數(shù)據(jù)庫(kù)如何使用DELETE語(yǔ)句從數(shù)據(jù)庫(kù)表中刪除數(shù)據(jù)(數(shù)據(jù)庫(kù)數(shù)據(jù)刪除)
- Mysql中如何刪除表重復(fù)數(shù)據(jù)
- mysql刪除表數(shù)據(jù)如何恢復(fù)
- MySQL清理數(shù)據(jù)并釋放磁盤空間的實(shí)現(xiàn)示例
- mysql中如何優(yōu)化表釋放表空間
- Mysql InnoDB刪除數(shù)據(jù)后釋放磁盤空間的方法
相關(guān)文章
MySQL?優(yōu)化利器?SHOW?PROFILE?的實(shí)現(xiàn)原理及細(xì)節(jié)展示
這篇文章主要介紹了MySQL優(yōu)化利器SHOW?PROFILE的實(shí)現(xiàn)原理,通過(guò)實(shí)例代碼展示SHOW PROFILE的用法,需要的朋友可以參考下2024-12-12
Windows下MySQL詳細(xì)安裝過(guò)程及基本使用
本文詳細(xì)講解了Windows下MySQL安裝過(guò)程及基本使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-12-12
mysql安裝出現(xiàn)Install/Remove of the Service D
這篇文章主要介紹了mysql安裝出現(xiàn)Install/Remove of the Service Denied!錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
一臺(tái)電腦(windows系統(tǒng))安裝兩個(gè)版本MYSQL方法步驟
由于新舊項(xiàng)目數(shù)據(jù)庫(kù)版本差距太大,編碼格式不同,引擎也不同,所以只好裝兩個(gè)數(shù)據(jù)庫(kù),這篇文章主要給大家介紹了關(guān)于一臺(tái)電腦(windows系統(tǒng))安裝兩個(gè)版本MYSQL的方法步驟,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
ERROR 1524 (HY000): Plugin ‘mysql_native
這篇文章主要介紹了ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded,本文提供了三種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03

