您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關MySQL占用空間后越刪越大的示例分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
你MySQL中查詢回表
話說有一天,我心血來潮。登錄阿里云,發現 RDS 占用的空間挺大的。想起有一張表,當初設計的不好,沒用的數據挺多的。就想著刪除清理一部分數據,節約空間。
說做就做,一條 delete 語句,如下:
沒想到意外發生了,刪除幾十萬條數據后,我再去查看 RDS 占用的數據空間,不僅沒降,還上升了。這是怎么回事?
這個問題可能很多人都沒有注意到。平時大家的關注點可能都不在這方面。
我把這個數據刪除后,阿里云立馬發郵件報警,說我們的 RDS 存儲空間過大,沒辦法,當初知識水平有限。就又花公司的錢,升級了存儲空間。
這個問題一直困惑著我,直到兩年前看了《高性能MySQL》。而今天剛好又有一個網友私信我,我想起了這件事。所以,今天就給大家解惑一下,為什么會這樣。
第一個就是網上很多人所說的那樣,這是一個MySQL的BUG,直到MySQL 5.7 版本才解決。由于我們當初選的是 MySQL 5.6 的版本,出現這個問題后,也咨詢了阿里云。但是阿里云給出的答復是只能進行數據遷移,雖然MySQL5.7版本,可以解決這個問題,但是阿里云的MySQL5.6的版本并不能直接升級到5.7。而遷移數據庫也太浪費時間和精力了,搞不好,再把主要數據給丟失了。BOSS 非剁了我不可。
第二個我要說的就是 MySQL 5.6中默認是獨立表空間,如果采用獨立表存儲模式,data 中還會產生 report_site_day.ibd 這類文件(存儲數據信息和索引信息)。而刪除的時候,它不會被刪除。
第三個就是 MySQL 對于刪除的功能的底層實現,并不是大家想象的那樣,執行 delete 就真的給刪除了。而是當你使用 delete 刪除的時候,MySQL 并沒有把數據文件刪除,而是將數據文件的標識位刪除,沒有整理文件,因此不會徹底釋放空間。被刪除的數據將會被保存在一個鏈接清單中,當有新數據寫入的時候,MySQL 會利用這些已刪除的空間再寫入。即,刪除操作會帶來一些數據碎片,正是這些碎片在占用硬盤空間。
關于數據遷移也會帶來一些問題,這個我們下一章再說。今天我先說一下,MySQL 官方推薦的 OPTIMIZE TABLE 命令來清理優化表 InnoDB 空間的做法。
OPTIMIZE TABLE 命令的格式如下:
具體的用法如下:
或者,你也可以這樣批量生成優化所有表的 SQL,再復制出來執行:
除此之外,我們還還可以把表設置為單表存儲的形式,這樣每個表中的數據單獨存儲,在刪除數據的時候,會隨著數據的刪除而釋放存儲空間。
至于數據遷移,我們可以先備份后刪除然后進行導入。
看完上述內容,你們對MySQL占用空間后越刪越大的示例分析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。