成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

刪除大量數(shù)據(jù)后,數(shù)據(jù)庫(kù)文件為何紋絲不動(dòng)?MySQL 存儲(chǔ)機(jī)制大揭秘

數(shù)據(jù)庫(kù)
通過(guò)理解InnoDB存儲(chǔ)機(jī)制,合理運(yùn)用定期監(jiān)控碎片率、分區(qū)表,可有效避免刪除數(shù)據(jù)后表文件“虛胖”問(wèn)題,提升數(shù)據(jù)庫(kù)存儲(chǔ)效率。?

一、問(wèn)題背景

“刪了90%數(shù)據(jù),數(shù)據(jù)庫(kù)文件為啥紋絲不動(dòng)?這是MySQL的bug嗎?”

上周一位讀者面試被問(wèn)懵了,這個(gè)問(wèn)題也戳中了很多人的痛點(diǎn)——明明刪了大把數(shù)據(jù),硬盤空間死活不釋放!

你是不是也遇到過(guò):

  • 執(zhí)行DELETE后,磁盤空間未釋放
  • .ibd文件大小不變,運(yùn)維報(bào)警頻發(fā)
  • 明明數(shù)據(jù)量減少,統(tǒng)計(jì)信息卻 “巋然不動(dòng)”

別慌,這真不是Bug! 而是 InnoDB 存儲(chǔ)引擎的底層設(shè)計(jì)機(jī)制決定的。今天就來(lái)扒開(kāi) InnoDB 的底層邏輯,教你 3 招馴服 “頑固” 的數(shù)據(jù)庫(kù)文件。

二、刪數(shù)據(jù)≠丟空間:MySQL 的 “假刪除” 套路

先看一組顛覆認(rèn)知的實(shí)驗(yàn):

Step 1:創(chuàng)建 200 萬(wàn)條數(shù)據(jù)的表

-- 創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)
CREATEDATABASEtest;
-- 創(chuàng)建測(cè)試表
CREATETABLE test_demo (
    idINT PRIMARY KEY AUTO_INCREMENT,
    nameVARCHAR(100),
    contentTEXT,
    create_time DATETIME
) ENGINE=InnoDB;

插入測(cè)試數(shù)據(jù):

-- 插入200萬(wàn)條測(cè)試數(shù)據(jù)
DELIMITER //
CREATEPROCEDURE insert_test_data()
BEGIN
    DECLARE i INTDEFAULT1;
    WHILE i <= 2000000 DO
        INSERTINTO test_demo (name, content, create_time)
        VALUES (
            CONCAT('name_', i),
            REPEAT('x', 1000),  -- 每條記錄約1KB
            NOW()
        );
        SET i = i + 1;
    ENDWHILE;
END //
DELIMITER ;

-- 執(zhí)行存儲(chǔ)過(guò)程
CALL insert_test_data();

Step 2:查看初始文件大小(約 1GB)

-- 查看表空間文件大小
SELECT 
    table_name,
    data_length/1024/1024 as data_size_mb,
    index_length/1024/1024 as index_size_mb
FROM information_schema.tables 
WHERE table_schema = 'test' 
AND table_name = 'test_demo';

Step 3:刪除 99% 數(shù)據(jù)(僅保留前 100 條)

-- 刪除id大于100的記錄
DELETE FROM test_demo WHERE id >100;

Step 4:查看文件大小

  • .ibd文件物理大小仍≈1GB(磁盤未釋放)
  • SELECT COUNT(*)返回 100 條(邏輯數(shù)據(jù)正確)

靈魂拷問(wèn):刪了 190 萬(wàn)條數(shù)據(jù),為啥空間沒(méi)釋放?

三、InnoDB 存儲(chǔ)的 3 個(gè) “反直覺(jué)” 設(shè)計(jì)

1. 數(shù)據(jù)頁(yè):最小存儲(chǔ)單位的 “空間壟斷”

  • 每個(gè)數(shù)據(jù)頁(yè)固定 16KB,相當(dāng)于圖書(shū)館的書(shū)架格子
  • 刪除 1 條記錄(可能只有 KB 級(jí)),不會(huì)釋放整個(gè)數(shù)據(jù)頁(yè)(16KB)
  • 頁(yè)內(nèi)空洞累積,導(dǎo)致文件 “虛胖”

InnoDB 數(shù)據(jù)頁(yè)的內(nèi)部結(jié)構(gòu):

(1) 記錄在頁(yè)中的存儲(chǔ)

還記得之前我們介紹的InnoDB 記錄結(jié)構(gòu)嗎?

從圖中我們可以看到,InnoDB 的 COMPACT 行格式確實(shí)分為兩個(gè)主要部分:

  • 記錄的額外信息
  • 記錄的真實(shí)數(shù)據(jù)

關(guān)于刪除的秘密其實(shí)藏在記錄頭信息中。

2. DELETE 的本質(zhì):標(biāo)記刪除而非物理刪除

操作

本質(zhì)行為

空間釋放

DELETE FROM t

將記錄頭信息中的delete_mask標(biāo)記為1(標(biāo)記為“可復(fù)用”)

? 不釋放

TRUNCATE TABLE

清空所有數(shù)據(jù)頁(yè),重建表空間

? 釋放

為什么不直接物理刪除?

事務(wù)安全優(yōu)先:寧肯占空間,不能丟數(shù)據(jù)。

  • 若物理刪除數(shù)據(jù),事務(wù)回滾時(shí)無(wú)法恢復(fù)(違反 ACID)
  • 標(biāo)記刪除是 “軟刪除”,數(shù)據(jù)頁(yè)可隨時(shí)恢復(fù)(通過(guò) undo 日志)
  • 這就是為什么ROLLBACK能秒級(jí)恢復(fù)數(shù)據(jù) —— 因?yàn)閿?shù)據(jù)根本沒(méi)被物理刪除

空間復(fù)用 vs 碎片累積

  • 標(biāo)記刪除的記錄:數(shù)據(jù)頁(yè)空間被標(biāo)記為“空洞”,新數(shù)據(jù)可覆蓋寫(xiě)入(空間復(fù)用)。
  • 碎片累積:頻繁增刪后,數(shù)據(jù)頁(yè)內(nèi)空洞增多,導(dǎo)致.ibd文件“虛胖”(實(shí)際數(shù)據(jù)量小,但文件占用大)。

3. 預(yù)分配策略:空間只增不減的 “霸道總裁”

  • InnoDB 按innodb_autoextend_increment(默認(rèn) 64MB)自動(dòng)擴(kuò)展表空間
  • 擴(kuò)展后即使數(shù)據(jù)刪除,空間也不會(huì)還給系統(tǒng)(文件系統(tǒng)不支持收縮)
  • 就像買房時(shí)買了 120㎡,住了 50㎡后想退 70㎡—— 不可能

四、實(shí)戰(zhàn)攻略:三招讓數(shù)據(jù)庫(kù) “瘦身成功”

場(chǎng)景

方案

命令

原理

注意事項(xiàng)

緊急清空全表(數(shù)據(jù)可丟)

TRUNCATE TABLE

TRUNCATE TABLE your_table;

銷毀并重建表空間,釋放所有空間

不可逆,適用于日志表等場(chǎng)景

重建表清理碎片(可停機(jī))

ALTER TABLE ... ENGINE=InnoDB

ALTER TABLE your_table ENGINE=InnoDB;

重建表空間,回收空洞和碎片

鎖表,大表需在低峰期操作

分區(qū)表刪除(歷史數(shù)據(jù)歸檔)

分區(qū)刪除

ALTER TABLE orders DROP PARTITION p_old;

刪除指定分區(qū),釋放對(duì)應(yīng)空間

需提前設(shè)計(jì)分區(qū)策略

我們看下執(zhí)行后的效果:

ALTER TABLE test_demo ENGINE=INNODB;

五、總結(jié)

  • 本質(zhì)原因:DELETE是邏輯刪除,空間釋放需依賴重建表或分區(qū)操作。
  • 核心認(rèn)知:MySQL優(yōu)先保證事務(wù)安全和性能,而非實(shí)時(shí)回收空間。
  • 面試要點(diǎn):需清晰區(qū)分“標(biāo)記刪除”與“物理刪除”,并能結(jié)合業(yè)務(wù)場(chǎng)景選擇合適的空間釋放方案。

通過(guò)理解InnoDB存儲(chǔ)機(jī)制,合理運(yùn)用定期監(jiān)控碎片率、分區(qū)表,可有效避免刪除數(shù)據(jù)后表文件“虛胖”問(wèn)題,提升數(shù)據(jù)庫(kù)存儲(chǔ)效率。

責(zé)任編輯:趙寧寧 來(lái)源: 程序員徐述
相關(guān)推薦

2010-06-09 15:40:59

MySQL數(shù)據(jù)庫(kù)文件

2019-06-20 15:25:14

MySQLL數(shù)據(jù)庫(kù)存儲(chǔ)

2021-05-19 08:21:09

MySQL數(shù)據(jù)庫(kù)GTID

2010-06-02 17:06:54

MySQL數(shù)據(jù)庫(kù)文件

2010-06-09 15:40:59

MySQL數(shù)據(jù)庫(kù)文件

2019-08-27 15:00:09

MySQL數(shù)據(jù)庫(kù)存儲(chǔ)

2010-04-21 12:13:44

Oracle數(shù)據(jù)庫(kù)

2011-03-30 14:08:27

MySQL數(shù)據(jù)庫(kù)刪除恢復(fù)

2010-05-05 10:19:19

Oracle數(shù)據(jù)導(dǎo)

2009-11-18 16:23:26

PHP數(shù)據(jù)庫(kù)文件

2010-04-22 16:08:24

Oracle數(shù)據(jù)庫(kù)

2011-06-07 10:12:27

2018-04-28 15:28:44

數(shù)據(jù)庫(kù)MySQL誤刪除

2010-06-01 15:46:52

MySQL數(shù)據(jù)庫(kù)文件

2011-03-24 11:14:46

2010-09-13 15:31:14

sql server數(shù)

2011-05-20 09:35:24

Oracle數(shù)據(jù)庫(kù)恢復(fù)備份

2021-03-12 10:12:40

數(shù)據(jù)庫(kù)SQLServer磁盤

2009-03-17 16:00:47

Oracle數(shù)據(jù)庫(kù)備份

2010-04-19 12:16:53

Oracle數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩欧美国产一区二区三区 | 日韩精品久久久 | 亚洲精品高清视频 | 日本午夜网站 | 亚洲91精品 | 天天插天天射天天干 | 欧美极品少妇xxxxⅹ免费视频 | 日韩精品区| 第四色狠狠 | 国产精品乱码一区二三区小蝌蚪 | 久久躁日日躁aaaaxxxx | 天天操一操 | 亚洲精品自在在线观看 | 一级特黄在线 | 二区视频 | 青青久视频 | 日韩在线视频免费观看 | 日韩欧美在 | 亚洲成人天堂 | 久久av.com| 日韩另类视频 | 精品国产乱码久久久久久果冻传媒 | 久久久久久999| 中文字幕一区在线 | 99re在线视频 | 久久久久久久久久久久久9999 | 爱操影视| 亚洲欧美视频 | 一区二区中文 | 免费h视频 | 亚洲在线| 成人免费一区二区 | 一区在线播放 | 亚洲精品第一 | 亚洲欧美在线一区 | 亚洲欧美日韩一区二区 | 天天色天天射天天干 | 69亚洲精品 | 久久久精品一区二区三区 | 日本在线视频一区二区 | 国产精品一区二区电影 |