精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL表空間回收的正確姿勢

運維 數據庫運維
為了縮小磁盤上表數據文件占用的空間,我們在最大的一張業務表中用delete命令刪除了一半兒的舊數據,刪除之后,磁盤上表數據文件并沒有縮小,即使刪除整張表的數據,文件依然沒有變小,這是為什么呢?

[[374540]]

本文轉載自微信公眾號「Linux開發那些事兒」,作者 LinuxThings  。轉載本文請聯系Linux開發那些事兒公眾號。

不知道大家有沒有遇到這樣的一種情況,線上業務在MySQL表上做增刪改查操作,隨著時間的推移,表里面的數據越來越多,表數據文件越來越大,數據庫占用的空間自然也逐漸增長

為了縮小磁盤上表數據文件占用的空間,我們在最大的一張業務表中用delete命令刪除了一半兒的舊數據,刪除之后,磁盤上表數據文件并沒有縮小,即使刪除整張表的數據,文件依然沒有變小,這是為什么呢?

本文將詳細的分析上述問題,并給出正確回收表空間的方法

前置說明

目前大部分MySQL數據庫都是用的 InnoDB 引擎,所以如無特殊說明,文中的實例都是基于InnoDB引擎的

在MySQL配置中有個配置項叫 innodb_file_per_table 將它設置為1之后, 每個表的數據會單獨存儲在一個以 .ibd 為后綴的文件中

如果 innodb_file_per_table 沒有開啟的話, 表的數據是存儲在系統的共享表空間,這樣即使刪除了表,共享表空間也不會釋放這部分空間

所以,通常情況下,都是將 innodb_file_per_table 選項設置為 1, 同時為了能直觀的看到表數據文件的大小變化,文中的實例也都是基于開啟了 此選項來說明的

問題重現

新建一張表ta,表的結構如下

  1. mysql> show create table ta\G 
  2. *************************** 1. row *************************** 
  3.        Table: ta 
  4. Create TableCREATE TABLE `ta` ( 
  5.   `id` int(11) NOT NULL
  6.   `ia` int(11) NOT NULL
  7.   PRIMARY KEY (`id`) 
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
  9. 1 row in set (0.00 sec) 

使用下面的存儲過程,向 ta 中批量插入數據

  1. delimiter // 
  2. create procedure multinsert(in beg int,in cnt int
  3. begin 
  4.     declare icnt int default 0; 
  5.     declare tmp int default 0; 
  6.     while icnt < cnt do 
  7.         set icnt = icnt + 1; 
  8.         set tmp = beg + icnt; 
  9.         insert into ta(id,ia) values(tmp,tmp); 
  10.     end while; 
  11. end// 
  12.  
  13. delimiter ; 

在MySQL控制臺執行 call multinsert(0,100000) 命令,往 ta表插入10萬條數據

  1. mysql> call multinsert(0,100000); 
  2. mysql> select count(*) from ta; 
  3. +----------+ 
  4. count(*) | 
  5. +----------+ 
  6. |   100000 | 
  7. +----------+ 
  8. 1 row in set (0.02 sec) 

查看磁盤上ta表的數據文件 ta.ibd 的大小

  1. [root@ecs-centos-7 test]# cd /var/lib/mysql/test/ 
  2. [root@ecs-centos-7 test]# ls -l ta.ibd  
  3. -rw-r----- 1 mysql mysql 11534336 1月   3 23:14 ta.ibd 

從上面的結果可以知道,ta表插入10萬條數據之后,ta.ibd 大小為 11534336 字節( 大約 11M )

現在我們使用 delete 命令刪除一半兒表數據( 5萬行記錄 )

  1. mysql> delete from ta where id between 1 and 50000; 
  2. Query OK, 10000 rows affected (0.03 sec) 
  3. mysql> select count(*) from ta; 
  4. +----------+ 
  5. count(*) | 
  6. +----------+ 
  7. |    50000 | 
  8. +----------+ 
  9. 1 row in set (0.02 sec) 

刪除操作完成之后,再次查看磁盤上 ta.ibd 的大小

  1. [root@ecs-centos-7 test]# cd /var/lib/mysql/test/ 
  2. [root@ecs-centos-7 test]# ls -l ta.ibd  
  3. -rw-r----- 1 mysql mysql 11534336 1月   3 23:14 ta.ibd 

從上面的結果可以知道,ta表刪除了一半兒,也就是5萬行數據之后,ta.ibd的大小是 11534336 字節( 約11M )

也就是說 ta表刪除數據前后,磁盤上表數據文件并沒有縮小

要弄明白數據文件為什么沒有縮小,就需要深入了解刪除數據的原理

刪除數據原理

我們都知道,InnoDB里的數據都是用B+樹組織的,關于B+樹的知識請參考 理解B+樹

 

圖(1)

上面是InnoDB的索引示意圖,其中用虛線框起來的節點是屬于Page1數據頁,葉子節點存儲的是索引對應的數據,它們按照索引從小到大的順序組成了一個有序數組

假如我們要刪除Page1頁中索引key值為 13 的數據,也即上圖中紅色部分

InnoDB引擎會把索引key值為13的節點標記為已刪除,它并不會回收節點真實的物理空間,只是將它標記為已刪除的節點,后續是可以復用的,所以,刪除表記錄,磁盤上數據文件不會縮小

你可能會說,上面只是刪除了Page1頁中一個節點的數據,那如果把Page1頁中節點數據全部刪除了,應該會回收Page1頁的空間吧?

答案是,不會回收

當Page1頁數據全部刪除了,整個數據頁都會被標記為已刪除,并且整個數據頁都可以復用,所以,這種情況下,磁盤上的數據文件仍然不會縮小

數據的復用

數據的復用涉及到數據節點的插入、刪除、轉移以及數據頁的合并等操作,具體的操作流程相關的細節請參考 理解B+樹,這里就不再重復說明了

數據節點的復用

在上面 圖(1) 中,當刪除了索引key值為 13 的節點后,此節點就被標記為可復用的

如果之后又插入了一條索引key值在 7 到 18 之間的記錄時,就會復用原來索引key值為13的數據節點

但是如果之后插入的記錄的索引key值不在 7 到 18 之間時,可能就無法復用原來索引key值為13的數據節點

也就是說,數據節點的復用,需要索引key值滿足一定的范圍條件

  • 數據頁的復用

在 圖(1) 當刪除了Page1數據頁全部數據節點后,Page1整頁都是可復用的,當插入的記錄需要用到新頁的時候,Page1就可以被復用

當相鄰的數據頁利用率比較低的時候,有可能會把它們合并到其中一個數據頁中,這時,另外一個數據頁就空出來了,這個空出來的數據頁就變成可復用的了

哪些操作會造成數據空洞

我們用 delete 命令刪除一條記錄后,InnoDB只是把對應的數據節點標記為已刪除且可復用的,這些可空著的等待使用的數據節點可以看作是一個一個的數據空洞

  • 刪除數據

刪除數據的時候,會造成數據空洞,前面已經解釋過,這里不再贅述了

  • 插入數據

如果數據是按照索引大小順序插入,這個時候數據頁是緊湊的,不會出現數據空洞

如果是從索引中間插入的話,有可能會造成頁分裂,分裂之后的頁有可能出現數據空洞,下圖就是插入導致頁分裂的一個例子

 

如圖所示,分裂前葉子頁面已經滿了,這時數據排列得很緊湊

現在插入了一個索引key值為15的數據,插入之后,Page1 頁分裂成了上圖中 Page1,Page2兩個頁面

分裂之后,Page1 頁面出現了兩個空洞,這兩個數據節點是可復用的,而 Page2頁面剛好滿了

  • 更新數據

更新數據可以看成先刪除再插入,也是有可能造成數據空洞

比如: id 是表 ta的主鍵, update ta set id = 10 where id = 1 語句把 id = 1 修改為 id = 10,相當于先刪除 id = 1 的記錄,再插入 id = 10 的記錄,這種情況是會產生數據空洞的

但是如果是類似 update ta set ia = ia + 1 where id = 1 這種沒有更改主鍵值的語句是不會造成空洞的

所以,更新數據可能會造成數據空洞

總結下來就是,表的增刪改操作,可能會造成數據空洞的,而線上的服務會對表進行大量的增刪改操作,數據空洞存在的可能性比較大

如何收縮表空間

既然一張表,經過大量無規則的增刪改操作之后,會產生大量的數據空洞

那如果我們新建一張和原來有數據空洞的表結構相同的新表,然后把舊表中的數據按照索引升序依次插入到新表中,待舊表數據全部插入到新表之后,刪除舊表,再把新表重命名為舊表的名字

由于新表中葉子節點數據是按順序添加的,所以頁面是很緊湊的, 頁面利用率很高,需要的頁面比舊表少了很多,這樣舊表中索引上的空洞在新表就不存在了,新表數據文件占用的磁盤空間自然就會縮小,這樣就實現了表空間的收縮的目的

下面介紹的幾種收縮表空間的方法,雖然方法不同,但是基本的原理都是通過重建表的形式來達到目的的

  • truntace table 表名

此操作等于 drop + create,先刪除表,然后再創建一個同名的新表,當然,再執行 truncate table 命令之前需要先保存一份舊表的數據, 命令執行完成之后,再把這份數據導入新表

  • alter table 表名 engine=InnoDB

這個操作是遍歷舊表主鍵索引的數據頁,把數據頁中的記錄生成B+樹結構,存儲到磁盤上的臨時文件中,數據頁遍歷完了之后,用臨時文件替換掉舊表的數據文件

從MySQL5.6版本之后,這個操作是 Online DDL 的,需要說明的是,這種方法需要掃描表數據文件,對于大表來說是非常耗時的,如果是針對線上服務的話,需要避開業務高峰期,小心操作。

注意: 在重建表的時候,InnoDB 不會把整張表占滿,每個頁留了大概10%左右的數據節點 給后續的更新用, 也就是說,其實重建表之后并不是最緊湊的

假如有這么一個過程: 將表 t 重建一次,

插入一部分數據,但是插入的這些數據,用掉了一部分的預留空間, 這種情況下,再重建一次表 t,就可能會出現重建表后比重建之前占用的空間還要大

小結

 

本文從一個實際的問題出發,重現問題、分析問題到解決問題,每一步都進行了詳細的分析,限于篇幅,有些細節沒有深入,需要讀者自行了解

 

責任編輯:武曉燕 來源: Linux開發那些事兒
相關推薦

2022-12-14 10:16:45

數據庫系統

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開發

2018-01-11 15:31:39

命令Linux關機

2024-05-28 08:32:18

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢

2023-01-30 07:41:43

2010-04-26 13:47:02

Oracle性能調整

2019-12-27 15:58:57

大數據IT互聯網

2024-09-25 08:22:06

2016-12-12 08:48:24

2021-09-15 16:20:02

Spring BootFilterJava

2017-10-12 11:30:34

Spark代碼PR

2019-10-30 17:06:50

AWS物聯網IoT

2018-06-13 10:27:04

服務器性能優化

2022-02-21 11:21:40

golang編程語言

2020-09-04 15:38:19

Web前端開發項目

2019-11-26 09:36:02

互聯網數據技術

2023-01-06 08:24:00

PandasPython
點贊
收藏

51CTO技術棧公眾號

欧美男人天堂网| 中文字幕第六页| 成人好色电影| 国产一区二区三区免费在线观看| 久久艹在线视频| 成年人小视频在线观看| 欧美gay视频| 亚洲三级在线免费| 久久免费看av| 精品人妻aV中文字幕乱码色欲| 亚洲精品孕妇| 久久国内精品一国内精品| 亚洲一区和二区| 欧美综合社区国产| 黑人与娇小精品av专区| av不卡在线免费观看| 欧美女子与性| 波多野洁衣一区| 国产在线一区二区三区| 在线能看的av| 欧美日本不卡| 深夜福利亚洲导航| 熟女俱乐部一区二区| 中文字幕久久精品一区二区| 在线看不卡av| 欧美a在线视频| 欧美xxxx免费虐| 中文字幕一区二区三区不卡在线| 久久久久久精| 亚洲精品无amm毛片| 黑人精品欧美一区二区蜜桃| 日本高清不卡的在线| 国产一级一片免费播放放a| 国产精品二区不卡| 亚洲视频在线免费看| 奇米777第四色| 日韩一区二区三区精品视频第3页| 91久久精品一区二区三| 浮妇高潮喷白浆视频| 日本aa在线| 亚洲欧美在线视频观看| 亚洲国产一区二区精品视频 | 99热国产在线观看| 国内精品99| 欧美精品一二区| 日本 欧美 国产| 91嫩草亚洲精品| 日韩在线观看你懂的| 亚洲综合欧美综合| 欧美影院三区| 日韩亚洲欧美中文高清在线| 成人做爰69片免网站| 成人影视亚洲图片在线| 中文字幕精品国产| 啪啪一区二区三区| 91精品精品| 久热99视频在线观看| 动漫性做爰视频| 黄色成人精品网站| 91成人福利在线| 日韩特级黄色片| 日韩精品久久久久久| 国产精品青草久久久久福利99| 无码人妻一区二区三区免费 | 黄色aaaaaa| 日本亚州欧洲精品不卡| 欧美va亚洲va| 人妻无码中文久久久久专区| 日韩一级电影| 伊人久久大香线蕉av一区二区| 国内精品卡一卡二卡三| 久久影视一区| 欧美精品制服第一页| 久久一区二区三| 亚洲欧美日本日韩| 国产精品扒开腿做爽爽爽男男| 成人小视频在线播放| 久草精品在线观看| 91久久精品一区二区别| 色欲av伊人久久大香线蕉影院| 91丝袜美腿高跟国产极品老师| 欧美日本亚洲| 欧美私人网站| 亚洲国产日产av| 国产a级片免费观看| 婷婷久久免费视频| 精品欧美一区二区三区精品久久| 800av在线播放| 青青草原综合久久大伊人精品 | 青青草精品在线视频| 亚洲日韩视频| 国产精品一二区| 丰满熟女一区二区三区| 久久亚洲精华国产精华液| 最新精品视频| 小早川怜子影音先锋在线观看| 欧美午夜精品一区二区蜜桃| 久久久久久久久久久影视| 亚洲区小说区图片区qvod按摩| www.日韩.com| 久久中文字幕免费| 国产尤物一区二区| 欧美日韩在线高清| 密臀av在线| 欧美日韩一区在线| 在线观看国产网站| 伊人成综合网| 国产精品www色诱视频| 精品国产亚洲一区二区麻豆| 国产视频一区二区在线| 成人免费毛片在线观看| 高清av一区二区三区| 亚洲国产精品va在线观看黑人| 黄色激情小视频| 奶水喷射视频一区| 岛国视频一区免费观看| 男女啪啪在线观看| 在线免费观看日本欧美| 美女露出粉嫩尿囗让男人桶| 亚洲精品成人无限看| 国产精品久久激情| 日韩欧美在线观看一区二区| 亚洲精品日日夜夜| 午夜剧场高清版免费观看| 国产成人精品三级高清久久91| 欧美精品www| 国产成人精品一区二区无码呦| 欧美极品xxx| 久久久免费视频网站| 极品束缚调教一区二区网站 | 国产精品自拍一区| 亚洲欧美日韩精品在线| 日韩在线影院| 亚洲美女性视频| 在线观看亚洲天堂| av电影在线观看一区| 日本a在线天堂| 国产精品xnxxcom| 久久精品视频播放| 一级aaaa毛片| 中文字幕佐山爱一区二区免费| 中文字幕第100页| 日韩精品免费一区二区三区| 国产99在线|中文| 欧美色18zzzzxxxxx| 激情av一区二区| 亚洲天堂美女视频| 一本久久综合| 欧美日韩亚洲免费| 久久精品女人天堂av免费观看| 国产丝袜一区二区三区| 亚洲GV成人无码久久精品 | 日韩美女一区二区三区四区| 69av.com| 成人综合在线视频| 亚洲国产精品成人天堂| 久久精品色播| 国产91九色视频| 午夜在线视频播放| 欧美一区二区三区在线观看视频 | 国产小视频福利在线| 在线观看国产91| 免费黄色激情视频| 国产精品一区二区三区乱码| 黑人巨茎大战欧美白妇| 99国产精品免费网站| 97久久久久久| 黄色的视频在线免费观看| 欧美在线色视频| 久草福利资源在线| 福利一区二区在线观看| 国产精品va无码一区二区| 欧美美乳视频| 92看片淫黄大片看国产片| mm视频在线视频| 亚洲欧美精品伊人久久| 国产精品久久久久毛片| 亚洲国产精品久久久久秋霞影院 | 亚洲av无码一区二区乱子伦| 午夜视频一区二区三区| 在线观看日本中文字幕| 国产一区91精品张津瑜| 亚洲午夜无码av毛片久久| 欧美激情777| 国产伦精品一区二区三毛| 日韩天堂在线| 欧美激情18p| 福利在线午夜| 亚洲国产精品99| 亚洲天堂avav| 精品久久久久久久久久久| 老司机福利在线观看| 成人午夜视频在线观看| 久久久久久三级| 国内精品嫩模av私拍在线观看| 欧美日韩国产三区| 中文字幕久久精品一区二区| 国产精品99一区| 女同一区二区免费aⅴ| 国产亚洲精品一区二555| 亚洲国产精品国自产拍久久| 欧美影院午夜播放| 精品亚洲永久免费| 国产精品亲子伦对白| 蜜臀av粉嫩av懂色av| 精彩视频一区二区三区| 东京热加勒比无码少妇| 亚洲午夜一区| 亚洲国产精品女人| 加勒比久久综合| 国产麻豆日韩| 国产一区精品二区| 国产精品狠色婷| 性欧美xxx69hd高清| 欧美激情久久久久| 老司机午夜在线视频| 国产亚洲精品久久久久久| 亚洲精品免费在线观看视频| 欧美日高清视频| 中文字幕天堂在线| 福利一区视频在线观看| 国产一级免费观看| 亚洲欧美日韩综合aⅴ视频| 国产精品久久久久久久av| 91在线看国产| 日韩少妇一区二区| 高清成人免费视频| 91精品视频国产| 精品一区二区日韩| 日本www.色| 日韩精品乱码免费| 欧美精品无码一区二区三区| 国产伦理一区| www国产精品内射老熟女| 亚洲激情av| 丰满少妇大力进入| 激情久久一区| 无码av天堂一区二区三区| 欧美国产91| 久久综合久久久久| 激情欧美一区| 69sex久久精品国产麻豆| 今天的高清视频免费播放成人| 青青草综合视频| 国内揄拍国内精品久久| 日韩极品视频在线观看| 日韩午夜激情| 欧美韩国日本在线| 日本系列欧美系列| 激情黄色小视频| 国产suv一区二区三区88区| 女教师高潮黄又色视频| 成人av高清在线| 丰满岳乱妇一区二区| 91蝌蚪porny成人天涯| 91精品人妻一区二区| 国产偷国产偷亚洲高清人白洁| 国产美女免费网站| 中文字幕中文字幕在线一区| 四虎永久免费在线| 亚洲欧美综合另类在线卡通| 欧美日韩一级大片| 福利视频一区二区| 少妇又紧又色又爽又刺激视频| 欧美久久久久久蜜桃| 国产婷婷在线视频| 亚洲国产高清福利视频| 免费一级毛片在线观看| 最近2019年手机中文字幕| а√天堂在线官网| 久久免费国产精品1| 国产成人免费9x9x人网站视频 | 中文字幕精品一区二区精| 91精品国产综合久久久久久漫画 | 亚洲日本中文字幕免费在线不卡| 国产二区视频在线观看| 日韩视频在线一区| sm在线观看| 国产精品视频大全| 91精品短视频| 欧美日韩在线观看一区| 小小影院久久| 可以在线看的av网站| 蜜臀久久99精品久久久画质超高清 | 国产精品99久久久| 永久免费看mv网站入口78| 中文字幕日韩av资源站| 国产一级大片在线观看| 在线免费观看不卡av| 亚洲爆乳无码一区二区三区| 亚洲欧美制服第一页| 三级资源在线| 国产精品99免视看9| 国产精品香蕉| 在线免费观看成人网| 亚洲精品极品| 久国产精品视频| 97精品国产露脸对白| 91香蕉一区二区三区在线观看| 五月天激情小说综合| 国产免费福利视频| 亚洲男人的天堂在线播放| 在线中文字幕第一页| 国产精品av在线播放| 国产福利一区二区精品秒拍| 四虎影视永久免费在线观看一区二区三区| 欧美日韩国内| 性chinese极品按摩| 久久婷婷一区二区三区| 国产主播在线观看| 69堂成人精品免费视频| 久蕉依人在线视频| 久久青草福利网站| av在线精品| 亚洲bbw性色大片| 在线视频亚洲| www.555国产精品免费| 亚洲色图第一区| 国产又黄又大又爽| 尤物yw午夜国产精品视频明星| а√天堂中文资源在线bt| 亚洲一区二区在线| 亚洲澳门在线| 中文字幕永久有效| 国产精品全国免费观看高清| 无码人妻熟妇av又粗又大| 日韩电影免费观看在线观看| 不卡av免费观看| 成人欧美视频在线| 欧美精品自拍| 九色91porny| 亚洲少妇最新在线视频| 国产又粗又黄又爽| 色哟哟入口国产精品| aaaa欧美| 亚洲国产高清国产精品| 全国精品久久少妇| 正在播放国产对白害羞| 欧美少妇xxx| 婷婷五月在线视频| 91久久国产婷婷一区二区| 我不卡手机影院| 亚洲网中文字幕| 一区av在线播放| 亚洲女同志亚洲女同女播放| 久久久久久网站| 日韩av网站在线免费观看| 国产l精品国产亚洲区久久| 久久久久久久免费视频了| 黄色在线免费观看| 国产一区二区三区视频在线观看| 欧美日韩在线精品一区二区三区激情综合| 日本精品国语自产拍在线观看| 青青草伊人久久| 99久久99久久精品免费| 91精品视频网| 欧洲中文在线| 欧美国产综合视频| 日韩精品久久久久久| 四虎884aa成人精品| 欧美一级精品大片| 蜜桃av.网站在线观看| 日韩国产伦理| 狠狠色综合播放一区二区| 欧美黑人精品一区二区不卡| 精品国产1区2区3区| www.精品| 宅男一区二区三区| 国产91精品露脸国语对白| 天天操天天爽天天干| 亚洲人午夜精品免费| a一区二区三区亚洲| 国产高清av在线播放| 久久久久久久综合色一本| 亚洲一级特黄毛片| 久久久久久久久久久91| 亚洲最好看的视频| 亚洲妇熟xx妇色黄蜜桃| 性久久久久久久久久久久| 第一页在线观看| 成人区精品一区二区| 久久久久国产精品一区三寸| 成人三级视频在线观看| 亚洲国产欧美日韩精品| 欧美与亚洲与日本直播| 特级西西444| 久久久精品国产99久久精品芒果| 99久久精品国产色欲| 欧洲美女免费图片一区| 亚洲男女av一区二区| 一级性生活毛片| 日韩欧美综合在线| 日韩网站中文字幕| 欧美国产日韩激情| 国产精品每日更新| 天堂av网在线| 亚洲自拍高清视频网站| 三级欧美在线一区| 国产精品suv一区二区| 丝袜亚洲另类欧美重口|